Navegación por el espacio de nombres XPath

Para usar consultas XPath con documentos XML, debe direccionar correctamente los espacios de nombres XML y los elementos que contienen los espacios de nombres. Los espacios de nombres impiden ambigüedades que pueden producirse cuando se usan nombres en más de un contexto; Por ejemplo, el nombre ID puede hacer referencia a más de un identificador asociado a distintos elementos de un documento XML. La sintaxis del espacio de nombres especifica URI, nombres y prefijos que distinguen los elementos de un documento XML.

En el ejemplo de este tema se muestra el uso de prefijos para navegar por un documento XML con XPathNavigator. Para obtener más información sobre los espacios de nombres y la sintaxis, vea Archivos XML: Descripción de los espacios de nombres XML.

Declaraciones de espacios de nombres

Las declaraciones de espacio de nombres hacen que los elementos de un documento XML sean distinguibles y direccionados cuando se utiliza una instancia de XPathNavigator. Los prefijos de los espacios de nombres proporcionan una sintaxis breve para direccionar los espacios de nombres.

Los prefijos se definen mediante el formato: <e:Envelope xmlns:e=http://schemas.xmlsoap.org/soap/envelope/>. en esta sintaxis, el prefijo "e" es una abreviatura del URI formal del espacio de nombres. Puede identificar el Body elemento como miembro del Envelope espacio de nombres mediante la sintaxis : e:Body.

Se hará referencia al siguiente documento XML como response.xml en el ejemplo de navegación de la sección siguiente.

<?xml version="1.0" encoding="utf-8" ?>
<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/">
  <e:Body>
    <s:Search xmlns:s="http://schemas.microsoft.com/v1/Search">
      <r:request xmlns:r="http://schemas.microsoft.com/v1/Search/metadata"
                 xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      </r:request>
    </s:Search>
  </e:Body>
</e:Envelope>

El código de esta sección usa objetos XPathNavigator y XmlNamespaceManager para seleccionar el elemento Search del documento XML de la sección anterior. La expresión xpath de la consulta incluye los prefijos de los espacios de nombres para cada elemento de la ruta. Especificar la identidad precisa de los espacios de nombres que contienen cada elemento garantiza la correcta navegación al elemento Search a través del método SelectSingleNode.

using (XmlReader reader = XmlReader.Create("response.xml"))
{
    XPathDocument doc = new XPathDocument(reader);
    XPathNavigator nav = doc.CreateNavigator();

    XmlNamespaceManager nsmgr = new XmlNamespaceManager(nav.NameTable);
    nsmgr.AddNamespace("e", @"http://schemas.xmlsoap.org/soap/envelope/");
    nsmgr.AddNamespace("s", @"http://schemas.microsoft.com/v1/Search");
    nsmgr.AddNamespace("r", @"http://schemas.microsoft.com/v1/Search/metadata");
    nsmgr.AddNamespace("i", @"http://www.w3.org/2001/XMLSchema-instance");

    string xpath = "/e:Envelope/e:Body/s:Search";

    XPathNavigator element = nav.SelectSingleNode(xpath, nsmgr);

    Console.WriteLine("Element Prefix:" + element.Prefix +
    " Local name:" + element.LocalName);
    Console.WriteLine("Namespace URI: " + element.NamespaceURI);
}

La precisión que se logra al usar espacios de nombres completos y nombres completos no se obtiene solo por comodidad. Una pequeña experimentación con la definición de documento y el código de los ejemplos anteriores comprobarán que la navegación sin nombres de elementos completos produce excepciones. Por ejemplo, la definición del elemento: <Search xmlns="http://schemas.microsoft.com/v1/Search">, y la consulta: cadena xpath = "/s:Envelope/s:Body/Search"; en el elemento Search sin el prefijo de espacio de nombres devuelve null en lugar del elemento Search.

Consulte también