Freigeben über


Ausführen von XPath-Abfragen mit Namespaces (SQLXMLOLEDB-Anbieter)

XPath-Abfragen können Namespaces enthalten. Wenn die Schemaelemente namespace qualifiziert sind (d. h., wenn sie einen Zielnamespace enthalten), müssen XPath-Abfragen für das Schema diesen Namespace angeben.

Da die Verwendung des Platzhalterzeichens (*) in SQLXML 4.0 nicht unterstützt wird, müssen Sie die XPath-Abfrage mithilfe eines Namespacepräfixes angeben. Um dieses Präfix zu beheben, verwenden Sie die Namespaces-Eigenschaft, um die Namespacebindung anzugeben.

Im folgenden Beispiel gibt die XPath-Abfrage Namespaces mithilfe des Platzhalterzeichens (*) und der XPath-Funktionen local-name() und namespace-uri() an. Diese XPath-Abfrage gibt alle Elemente zurück, in denen sich der lokale Name befindet Contact und der Namespace-URI ist urn:myschema:Contacts.

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

In SQLXML 4.0 muss diese XPath-Abfrage mit einem Namespacepräfix angegeben werden. Ein Beispiel hierfür ist x:Contactx das Namespacepräfix. Betrachten Sie das folgende XSD-Schema:

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

Da dieses Schema den Zielnamespace definiert, muss eine XPath-Abfrage (z. B. "Employee") für das Schema den Namespace enthalten.

Dies ist eine Beispielanwendung für Microsoft Visual Basic, die eine XPath-Abfrage (x:Employee) für das vorherige XSD-Schema ausführt. Zum Auflösen des Präfixes wird die Namespacebindung mithilfe der Namespaces-Eigenschaft angegeben.

Hinweis

Im Code müssen Sie den Namen der Instanz von SQL Server in der Verbindungszeichenfolge angeben. Außerdem gibt dieses Beispiel die Verwendung des SQL Server Native Client (SQLNCLI11) für den Datenanbieter an, der zusätzliche Netzwerkclientsoftware installiert werden muss. Weitere Informationen finden Sie unter Systemanforderungen für 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  

So testen Sie diese Anwendung

  1. Speichern Sie das XSD-Beispielschema in einem Ordner.

  2. Erstellen Sie ein ausführbares Visual Basic-Projekt, und kopieren Sie den Code in das Projekt. Ändern Sie den angegebenen Verzeichnispfad entsprechend.

  3. Fügen Sie die folgende Projektreferenz hinzu:

    "Microsoft ActiveX Data Objects 2.8 Library"  
    
  4. Führen Sie die Anwendung aus.

Dies ist das Teilergebnis:

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

Die Präfixe, die im XML-Dokument generiert werden, sind beliebig, weisen jedoch demselben Namespace zu.