Compartilhar via


Executando consultas XPath com namespaces (classes gerenciadas SQLXML)

As consultas XPath podem incluir namespaces. Se os elementos de esquema forem qualificados por namespace (use um namespace de destino), as consultas XPath com relação ao esquema deverão especificar o namespace.

Como o caractere curinga (*) não é suportado no Microsoft SQLXML 4.0, você precisa especificar a consulta XPath usando um prefixo de namespace. Para resolver o prefixo, use a propriedade namespaces para especificar a associação de namespace.

No exemplo a seguir, a consulta XPath especifica namespaces usando o caractere curinga (*) e o funções XPath local-name() e namespace-uri() . Essa consulta XPath retorna todos os elementos em que o nome local é Employee e o URI de namespace é urn:myschema:Contacts:

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

No SQLXML 4.0, especifique essa consulta XPath com um prefixo de namespace. Um exemplo é x:Contact, em que x é o prefixo de namespace. Considere o esquema XSD a seguir:

<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 esse esquema define o namespace de destino, uma consulta XPath (como "Employee") com relação a esse esquema precisa incluir o namespace.

O exemplo de aplicativo C# a seguir executa uma consulta XPath com relação ao esquema XSD anterior (MySchema.xml). Para resolver o prefixo, especifique a associação de namespace usando a propriedade Namespaces do objeto SqlXmlCommand.

ObservaçãoObservação

No código, é necessário 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, o Microsoft .NET Framework deverá estar instalado no computador.

Para testar o aplicativo

  1. Salve o esquema XSD (MySchema.xml) que é fornecido neste exemplo em uma pasta.

  2. Salve o código C# (DocSample.cs) fornecido neste exemplo na mesma pasta em que o esquema está armazenado. (Se você armazenar os arquivos em pastas diferentes, terá que editar o código e especificar o caminho de diretório apropriado para o esquema de mapeamento.)

  3. Compile o código. Para compilar o código no prompt de comando, use:

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

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

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