Compartilhar via


Executando consultas XPath com namespaces (provedor SQLXMLOLEDB)

As consultas XPath podem incluir namespaces. Se os elementos de esquema forem qualificados por namespace (ou seja, se incluírem um namespace de destino), as consultas XPath com relação ao esquema precisarão especificar esse namespace.

Como não há suporte ao uso do caractere curinga (*) no SQLXML 4.0, você precisa especificar a consulta XPath usando um prefixo de namespace. Para resolver esse prefixo, use a propriedade namespaces para especificar a associação de namespace.

No exemplo a seguir, a consulta XPath especifica namespaces usando o caractere curinga (*) e as funções XPath local-name() e namespace-uri(). Essa consulta XPath retorna todos os elementos em que o nome local é Contact e o URI de namespace é urn:myschema:Contacts.

/*[local-name() = 'Contact' and namespace-uri() = 'urn:myschema:Contacts']

No SQLXML 4.0, essa consulta XPath deve ser especificada com um prefixo de namespace. Um exemplo é x:Contact, em que x é o prefixo de namespace. Considere o esquema XSD a seguir:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
            xmlns:con="urn:myschema:Contacts"
            targetNamespace="urn:myschema:Contacts">
<complexType name="ContactType">
  <attribute name="CID" sql:field="ContactID" type="ID"/>
  <attribute name="FName" sql:field="FirstName" type="string"/>
  <attribute name="LName" sql:field="LastName"/> 
</complexType>
<element name="Contact" type="con:ContactType" sql:relation="Person.Contact"/>
</schema>

Como esse esquema define o namespace de destino, uma consulta XPath (como "Employee") com relação ao esquema precisa incluir o namespace.

Este é um aplicativo de exemplo do Microsoft Visual Basic que executa uma consulta XPath (x:Employee) no esquema XSD anterior. Para resolver o prefixo, a associação de namespace é especificada usando a propriedade namespaces.

ObservaçãoObservação

No código, é necessário fornecer o nome da instância do SQL Server na cadeia de conexão. Este exemplo também especifica o uso do SQL Server Native Client (SQLNCLI10) para o provedor de dados, o que requer a instalação adicional do software cliente da rede. Para obter mais informações, consulte Requisitos de sistema do SQL Server 2008 Native Client.

Option Explicit
Private Sub Form_Load()
    Dim con As New ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim stm As New ADODB.Stream
    con.Open "provider=SQLXMLOLEDB.4.0;Data Provider=SQLNCLI10;Data Source=SqlServerName;Initial Catalog=AdventureWorks;Integrated Security=SSPI;"
    Set cmd.ActiveConnection = con
    stm.Open
    cmd.Properties("Output Stream").Value = stm
    cmd.Properties("Output Encoding") = "utf-8"
    cmd.Properties("Mapping schema") = "C:\DirectoryPath\con-ex.xml"
    cmd.Properties("namespaces") = "xmlns:x='urn:myschema:Contacts'"
    '  Debug.Print "Set Command Dialect to DBGUID_XPATH"
    cmd.Dialect = "{ec2a4293-e898-11d2-b1b7-00c04f680c56}"
    cmd.CommandText = "x:Contact"
    cmd.Execute , , adExecuteStream 
    stm.Position = 0
    Debug.Print stm.ReadText(adReadAll)
End Sub

Para testar esse aplicativo

  1. Salve o esquema XSD do exemplo em uma pasta.

  2. Crie um projeto executável do Visual Basic e copie o código nele. Altere o caminho de diretório especificado conforme apropriado.

  3. Adicione a seguinte referência de projeto:

    "Microsoft ActiveX Data Objects 2.8 Library"
    
  4. Execute o aplicativo.

Este é o resultado parcial:

<y0:Employee xmlns:y0="urn:myschema:Contacts" 
             LName="Achong" CID="1" FName="Gustavo"/>
<y0:Employee xmlns:y0="urn:myschema:Employees" 
             LName="Abel" CID="2" FName="Catherine"/>

Os prefixos gerados no documento XML são arbitrários, mas são mapeados para o mesmo namespace.

Para obter informações sobre como especificar um namespace de destino em esquemas XDR, consulte Especificando um namespace de destino usando sql:target-namespace (Esquema XDR).