2010-04-04 19 views
10

Mi código no devuelve el nodoXPath no funciona como se desea en C#

XmlDocument xml = new XmlDocument(); 
xml.InnerXml = text; 

XmlNode node_ = xml.SelectSingleNode(node); 
return node_.InnerText; // node_ = null ! 

Estoy bastante seguro de que mi XML y XPath son correctos.

Mi XPath: /ItemLookupResponse/OperationRequest/RequestId

Mi XML:

<?xml version="1.0"?> 
<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05"> 
    <OperationRequest> 
    <RequestId>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx</RequestId> 
    <!-- the rest of the xml is irrelevant --> 
    </OperationRequest> 
</ItemLookupResponse> 

El nodo de mis declaraciones XPath es siempre nula por alguna razón. ¿Alguien puede ayudar?

Respuesta

20

Su XPath es casi correcto, ¡simplemente no tiene en cuenta el espacio de nombres XML predeterminado en el nodo raíz!

<ItemLookupResponse 
    xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05"> 
      *** you need to respect this namespace *** 

Es necesario tomar en cuenta y cambiar su código como este:

XmlDocument xml = new XmlDocument(); 
xml.InnerXml = text; 

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable); 
nsmgr.AddNamespace("x", "http://webservices.amazon.com/AWSECommerceService/2005-10-05"); 

XmlNode node_ = xml.SelectSingleNode(node, nsmgr); 

Y entonces su XPath debe ser:

/x:ItemLookupResponse/x:OperationRequest/x:RequestId 

Ahora, su node_.InnerText debe definitivamente no ¡Sea NULL más!

+3

@ Nick Brooks: no, si hay un espacio de nombres XML en el elemento raíz, entonces su Los elementos XML a continuación que se encuentran en ese espacio de nombres, y por lo tanto necesita referenciarlos usando ese espacio de nombres. Ese es el objetivo del espacio de nombres XML: poder distinguir elementos XML de potencial del mismo nombre, poniéndolos en espacios de nombres específicos de la aplicación o del proveedor. –

+1

El espacio de nombres se puede agregar así, que es un poco mejor que la codificación dura del espacio de nombres nsmgr.AddNamespace ("x", doc.DocumentElement.NamespaceURI); –

+0

Um, ¿no podemos de alguna manera configurarlo (A) usar automáticamente todos los atributos 'xmlns', o (B) simplemente decirle a .NET que ignore los espacios de nombres y que coincida con lo que literalmente vemos en nuestro archivo XML? Además, ¿de dónde viene la cadena '" x "'? – Qwertie

0

Perdón por la respuesta tardía, pero tuve un problema similar hace un momento.

Si realmente quiere hacer caso omiso de ese espacio de nombres a continuación, sólo eliminarlo de la cadena que se utiliza para inicializar el XmlDocument

text=text.Replace(
"<ItemLookupResponse xmlns=\"http://webservices.amazon.com/AWSECommerceService/2005-10-05\">", 
"<ItemLookupResponse>"); 

XmlDocument xml = new XmlDocument(); 
xml.InnerXml = text; 

XmlNode node_ = xml.SelectSingleNode(node); 
return node_.InnerText; 
Cuestiones relacionadas