Exécution de requêtes XPath avec des espaces de noms (classes managées SQLXML)

S’applique à :SQL ServerAzure SQL Database

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 (utilisent un espace de noms cible), les requêtes XPath sur le schéma doivent spécifier cet espace de noms.

Étant donné que le caractère générique (*) n’est pas pris en charge dans Microsoft SQLXML 4.0, vous devez spécifier la requête XPath à l’aide d’un préfixe d’espace de noms. Pour résoudre le 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 les 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 Employee et l’URI d’espace de noms est urn:myschema:Contacts :

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

Dans SQLXML 4.0, spécifiez cette requête XPath avec un préfixe d'espace de noms. Par exemple , x:Contact, 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>  

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

L'exemple d'application C# suivant exécute une requête XPath sur le schéma XSD précédent (MySchema.xml). Pour résoudre le préfixe, spécifiez la liaison d’espace de noms à l’aide de la propriété Namespaces de l’objet SqlXmlCommand.

Notes

Dans le code, vous devez fournir le nom du instance de SQL Server dans la chaîne de connexion.

using System;  
using Microsoft.Data.SqlXml;  
using System.IO;  
class Test  
{  
      static string ConnString = "Provider=SQLOLEDB;Server=(local);database=AdventureWorks;Integrated Security=SSPI";  
      public static int testXPath()  
      {  
         //Stream strm;  
         SqlXmlCommand cmd = new SqlXmlCommand(ConnString);  
         cmd.CommandText = "x:Contact[@CID='1']";  
         cmd.CommandType = SqlXmlCommandType.XPath;  
         cmd.RootTag = "ROOT";  
         cmd.Namespaces = "xmlns:x='urn:myschema:Contacts'";  
         cmd.SchemaPath = "MySchema.xml";  
         using (Stream strm = cmd.ExecuteStream()){  
            using (StreamReader sr = new StreamReader(strm)){  
               Console.WriteLine(sr.ReadToEnd());  
            }  
         }  
         return 0;  
      }  
      public static int Main(String[] args)  
      {  
         testXPath();  
         return 0;  
      }  
   }  

Pour tester cet exemple, vous devez avoir installé Microsoft .NET Framework sur votre ordinateur.

Pour tester l'application

  1. Enregistrez dans un dossier le schéma XSD (MySchema.xml) fourni dans cet exemple.

  2. Enregistrez le code C# (DocSample.cs) fourni dans cet exemple dans le même dossier dans lequel le schéma est stocké. (Si vous stockez les fichiers dans un dossier différent, vous devrez modifier le code et spécifier le chemin d'accès approprié au répertoire pour le schéma de mappage.)

  3. Compilez le code. Pour compiler le code à l'invite de commandes, utilisez :

    csc /reference:Microsoft.Data.SqlXML.dll DocSample.cs  
    

    Un fichier exécutable (DocSample.exe) est alors créé.

  4. À l'invite de commandes, exécutez DocSample.exe.