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 pour l’espace de noms (autrement dit, s’ils incluent un espace de noms cible), les requêtes XPath sur le schéma doivent spécifier cet espace de noms.

Étant donné que l’utilisation du caractère générique (*) n’est pas prise en charge dans SQLXML 4.0, vous devez spécifier la requête XPath à l’aide d’un préfixe d’espace de noms. Pour résoudre ce préfixe, utilisez la propriété espaces de noms pour spécifier la liaison d’espace de noms.

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

/*[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. Par exemple x:Contact, où x est le préfixe d’espace de noms. Considérez 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 ») sur le schéma doit inclure l’espace de noms.

Il s’agit d’un exemple d’application Microsoft Visual Basic qui exécute une requête XPath (x :Employee) sur 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) pour le fournisseur de données, ce qui nécessite l’installation d’un logiciel client réseau supplémentaire. Pour plus d’informations, consultez Configuration système 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 du répertoire spécifié selon les besoins.

  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 sont mappés au même espace de noms.