Partilhar via


Especificar um namespace de destino usando o atributo targetNamespace (SQLXML 4.0)

Aplica-se a: SQL Server Banco de Dados SQL do Azure

Ao escrever esquemas XSD, você pode usar o atributo XSD targetNamespace para especificar um namespace de destino. Este artigo descreve como os atributos XSD targetNamespace, elementFormDefaulte attributeFormDefault e funcionam, como eles afetam a instância XML gerada e como as consultas XPath são especificadas com namespaces.

Você pode usar o xsd:targetNamespace atributo para colocar elementos e atributos do namespace padrão em um namespace diferente. Você também pode especificar se os elementos e atributos do esquema declarados localmente devem aparecer qualificados por um namespace, seja explicitamente, usando um prefixo, ou implicitamente, por padrão. Você pode usar os elementFormDefault atributos and attributeFormDefault no <xsd:schema> elemento para especificar globalmente a qualificação de elementos e atributos locais, ou pode usar o form atributo para especificar elementos e atributos individuais separadamente.

Exemplos

Para criar exemplos de funcionamento usando os exemplos a seguir, é necessário atender a determinados requisitos. Para obter mais informações, consulte Requisitos para executar exemplos de SQLXML.

R. Especificar um namespace de destino

O esquema XSD a seguir especifica um namespace de destino usando o xsd:targetNamespace atributo. O esquema também define os valores de elementFormDefault atributo e attributeFormDefault como "unqualified" (o valor padrão para esses atributos). Esta é uma declaração global e afeta todos os elementos locais (<Order> no esquema) e atributos (CustomerID, ContactName, e OrderID no esquema).

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
    xmlns:CO="urn:MyNamespace"
    targetNamespace="urn:MyNamespace">
    <xsd:annotation>
        <xsd:appinfo>
            <sql:relationship name="CustOrders"
                parent="Sales.Customer"
                parent-key="CustomerID"
                child="Sales.SalesOrderHeader"
                child-key="CustomerID" />
        </xsd:appinfo>
    </xsd:annotation>

    <xsd:element name="Customer"
        sql:relation="Sales.Customer"
        type="CO:CustomerType" />

    <xsd:complexType name="CustomerType">
        <xsd:sequence>
            <xsd:element name="Order"
                sql:relation="Sales.SalesOrderHeader"
                sql:relationship="CustOrders"
                type="CO:OrderType" />
        </xsd:sequence>
        <xsd:attribute name="CustomerID" type="xsd:string" />
        <xsd:attribute name="SalesPersonID" type="xsd:string" />
    </xsd:complexType>
    <xsd:complexType name="OrderType">
        <xsd:attribute name="SalesOrderID" type="xsd:integer" />
        <xsd:attribute name="CustomerID" type="xsd:string" />
    </xsd:complexType>
</xsd:schema>

No esquema:

  • As CustomerType declarações de tipo e OrderType são globais e, portanto, estão incluídas no namespace de destino do esquema. Como resultado, quando esses tipos são referenciados na declaração do <Customer> elemento e seu <Order> elemento filho, um prefixo é especificado associado ao namespace de destino.

  • O <Customer> elemento também é incluído no namespace de destino do esquema porque é um elemento global no esquema.

Execute a consulta XPath a seguir no esquema:

(/CO:Customer[@CustomerID=1)

A consulta de XPath gera este documento da instância (somente alguns pedidos são mostrados):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <y0:Customer xmlns:y0="urn:MyNamespace"
      CustomerID="ALFKI" ContactName="Maria Anders">
        <Order CustomerID="ALFKI" OrderID="10643" />
        <Order CustomerID="ALFKI" OrderID="10692" />
        ...
  </y0:Customer>
  </ROOT>

Este documento de instância define o namespace urn:MyNamespace e associa um prefixo (y0) a ele. O prefixo <Customer> é aplicado somente ao elemento global. (O elemento é global porque é declarado como um filho do <xsd:schema> elemento no esquema.)

O prefixo não é aplicado aos elementos e atributos locais porque o valor de elementFormDefault e attributeFormDefault atributos é definido como "unqualified" no esquema. O <Order> elemento é local porque sua declaração aparece como um filho do <complexType> elemento que define o <CustomerType> elemento. Da mesma forma, os atributos (CustomerID, OrderID, e ContactName) são locais, não globais.

Criar uma amostra de trabalho desse esquema

  1. Copie o código do esquema anterior e cole-o em um arquivo de texto. Salve o arquivo como targetNamespace.xml.

  2. Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como targetNameSpaceT.xml no mesmo diretório em que você salvou targetNamespace.xmlo .

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
        <sql:xpath-query mapping-schema="targetNamespace.xml"
            xmlns:CO="urn:MyNamespace">
            /CO:Customer[@CustomerID=1]
        </sql:xpath-query>
    </ROOT>
    

    A consulta XPath no modelo retorna o <Customer> elemento para o cliente com um CustomerID de 1. A consulta XPath especifica o prefixo de namespace para o elemento na consulta e não para o atributo. (Os atributos locais não são qualificados, conforme especificado no esquema.)

    O caminho do diretório especificado para o esquema de mapeamento (targetNamespace.xml) é relativo ao diretório em que o modelo é salvo. Também é possível especificar um caminho absoluto, por exemplo:

    mapping-schema="C:\MyDir\targetNamespace.xml"
    
  3. Crie e use o script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.

    Para obter mais informações, consulte Usar o ADO para executar consultas SQLXML 4.0.

Se o esquema especificar elementFormDefault e attributeFormDefault atributos com valor "qualified", o documento de instância terá todos os elementos e atributos locais qualificados. Você pode alterar o esquema anterior para incluir esses atributos no <xsd:schema> elemento e executar o modelo novamente. Como os atributos agora também são qualificados na instância, a consulta XPath é alterada para incluir o prefixo do namespace.

Esta é a consulta XPath revisada:

/CO:Customer[@CO:CustomerID=1]

Este é o documento XML retornado:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
   <y0:Customer xmlns:y0="urn:MyNamespace" CustomerID="1" SalesPersonID="280">
      <Order SalesOrderID="43860" CustomerID="1" />
      <Order SalesOrderID="44501" CustomerID="1" />
      <Order SalesOrderID="45283" CustomerID="1" />
      <Order SalesOrderID="46042" CustomerID="1" />
   </y0:Customer>
</ROOT>