Partilhar via


Executando consultas XPath com namespaces (classes gerenciadas SQLXML)

Aplica-se a:SQL ServerBanco de Dados SQL do Azure

As consultas XPath podem incluir namespaces. Se os elementos do esquema forem qualificados para namespace (usar um namespace de destino), as consultas XPath contra o esquema devem especificar o namespace.

Como o carácter coringa (*) não é suportado no Microsoft SQLXML 4.0, deve especificar a consulta XPath usando um prefixo de namespace. Para resolver o prefixo, use a propriedade de namespaces para especificar a ligação ao namespace.

No exemplo seguinte, a consulta XPath especifica namespaces usando o carácter curinga (*) e as funções local-name() e namespace-uri() XPath. Esta consulta XPath devolve todos os elementos onde o nome local é Employee e o URI do espaço de nomes é urn:myschema:Contacts:

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

No SQLXML 4.0, especifique esta consulta XPath com um prefixo de namespace. Um exemplo é x:Contact, onde x é o prefixo do namespace. Considere o seguinte esquema XSD:

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

Como este esquema define o namespace de destino, uma consulta XPath (como "Employee") contra este esquema deve incluir o namespace.

A seguinte aplicação de exemplo C# executa uma consulta XPath contra o esquema XSD anterior (MySchema.xml). Para resolver o prefixo, especifique a ligação ao namespace usando a propriedade Namespaces do objeto SqlXmlCommand.

Observação

No código, deve fornecer o nome da instância do SQL Server na cadeia de conexão.

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

Para testar este exemplo, deve ter o Microsoft .NET Framework instalado no seu computador.

Para testar a aplicação

  1. Guarde o esquema XSD (MySchema.xml) fornecido neste exemplo numa pasta.

  2. Guarde o código C# (DocSample.cs) fornecido neste exemplo na mesma pasta onde o esquema está armazenado. (Se guardar os ficheiros numa pasta diferente, terá de editar o código e especificar o caminho de diretório apropriado para o esquema de mapeamento.)

  3. Compila o código. Para compilar o código no prompt de comandos, use:

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

    Isto cria um executável (DocSample.exe).

  4. No prompt de comandos, execute DocSample.exe.