Condividi tramite


Esecuzione di query XPath con spazi dei nomi (provider SQLXMLOLEDB)

Le query XPath possono includere spazi dei nomi. Se gli elementi dello schema sono spazi dei nomi qualificati, ovvero includono uno spazio dei nomi di destinazione, è necessario che nelle query XPath eseguite sullo schema sia specificato lo spazio dei nomi in questione.

Poiché l'utilizzo del carattere jolly (*) non è supportato in SQLXML 4.0, è necessario specificare la query XPath utilizzando un prefisso dello spazio dei nomi. Per risolvere tale prefisso, utilizzare la proprietà namespaces per specificare l'associazione dello spazio dei nomi.

Nella query XPath dell'esempio seguente gli spazi dei nomi vengono specificati utilizzando il carattere jolly (*) e le funzioni XPath local-name() e namespace-uri(). Questa query XPath restituisce tutti gli elementi in cui il nome locale è Contact e l'URI dello spazio dei nomi è urn:myschema:Contacts.

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

In SQLXML 4.0 questa query XPath deve essere specificata con un prefisso dello spazio dei nomi. Un esempio al riguardo è x:Contact, dove x è il prefisso dello spazio dei nomi. Si consideri lo schema XSD seguente:

<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>

Poiché questo schema definisce lo spazio dei nomi di destinazione, una query XPath (ad esempio "Employee") eseguita sullo schema deve includere lo spazio dei nomi.

Si tratta di un'applicazione Visual Basic Microsoft di esempio che esegue una query XPath (x:Employee) sullo schema XSD precedente. Per risolvere il prefisso, utilizzare la proprietà namespaces per specificare l'associazione dello spazio dei nomi.

[!NOTA]

Nel codice è necessario specificare il nome dell'istanza di SQL Server nella stringa di connessione. In questo esempio viene inoltre specificato l'utilizzo di SQL Server Native Client (SQLNCLI10) per il provider di dati che richiede l'installazione di un software client di rete aggiuntivo. Per ulteriori informazioni, vedere Requisiti di sistema per 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

Per testare l'applicazione

  1. Salvare lo schema XSD di esempio in una cartella.

  2. Creare un progetto eseguibile di Visual Basic in cui copiare il codice. Modificare il percorso di directory specificato in base alle esigenze.

  3. Aggiungere il riferimento al progetto seguente:

    "Microsoft ActiveX Data Objects 2.8 Library"
    
  4. Eseguire l'applicazione.

Risultato parziale:

<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"/>

I prefissi generati nel documento XML sono arbitrari, ma eseguono il mapping allo stesso spazio dei nomi.

Per informazioni sulla specifica di uno spazio dei nomi di destinazione negli schemi XDR, vedere Specifica di uno spazio dei nomi di destinazione mediante sql:target-namespace (schema XDR).