Partilhar 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 resolve 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 resolve o prefixo, a associação de namespace é especificada usando a propriedade namespaces.

Observação

No código, você deve fornecer o nome da instância de SQL Server na cadeia de conexão. Além disso, este exemplo especifica o uso do SQL Server Native Client (SQLNCLI11) para o provedor de dados, que exige a instalação de software cliente de rede adicional. Para obter mais informações, consulte Requisitos do sistema para SQL Server 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=SQLNCLI11;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.