Partager via


Exécution de requêtes XPath avec des espaces de noms (fournisseur SQLXMLOLEDB)

Les requêtes XPath peuvent inclure des espaces de noms. Si les éléments de schéma sont qualifiés par un espace de noms (autrement dit, s'ils incluent un espace de noms cible), les requêtes XPath contre le schéma doivent spécifier cet espace de noms.

L'utilisation du caractère générique (*) n'étant pas prise en charge dans SQLXML 4.0, vous devez spécifier la requête XPath en utilisant un préfixe d'espace de noms. Pour résoudre ce préfixe, utilisez la propriété namespaces pour spécifier la liaison d'espace de noms.

Dans l'exemple suivant, la requête XPath spécifie des des espaces de noms à l'aide du caractère générique (*) et des fonctions XPath local-name() et namespace-uri(). Cette requête XPath retourne tous les éléments dont le nom local est Contact et l'URI d'espace de noms est urn:myschema:Contacts.

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

Dans SQLXML 4.0, cette requête XPath doit être spécifiée avec un préfixe d'espace de noms. x:Contact constitue un exemple, où x est le préfixe d'espace de noms. Prenons le schéma XSD suivant :

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

Étant donné que ce schéma définit l'espace de noms cible, une requête Xpath (telle que « Employee ») contre le schéma doit inclure l'espace de noms.

Voici un exemple d'application Microsoft Visual Basic qui exécute une requête XPath (x:Employee) contre le schéma XSD précédent. Pour résoudre le préfixe, la liaison d'espace de noms est spécifiée à l'aide de la propriété namespaces.

[!REMARQUE]

Dans le code, vous devez fournir le nom de l'instance de SQL Server dans la chaîne de connexion. En outre, cet exemple spécifie l'utilisation de SQL Server Native Client (SQLNCLI11) comme fournisseur de données, ce qui requiert l'installation d'un logiciel client réseau supplémentaire. Pour plus d'informations, consultez Configuration requise pour 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

Pour tester cette application

  1. Enregistrez l'exemple de schéma XSD dans un dossier.

  2. Créez un projet exécutable Visual Basic et copiez-y le code. Modifiez le chemin d'accès au répertoire spécifié comme il se doit.

  3. Ajoutez la référence de projet suivante :

    "Microsoft ActiveX Data Objects 2.8 Library"
    
  4. Exécutez l'application.

Voici le résultat partiel :

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

Les préfixes générés dans le document XML sont arbitraires, mais ils mappent au même espace de noms.