2010-04-04 11 views
10

Il mio codice non restituisce il nodoXPath non funziona come desiderato in C#

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

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

Sono abbastanza sicuro che il mio XML e XPath siano corretti.

mio XPath: /ItemLookupResponse/OperationRequest/RequestId

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

Il nodo miei rendimenti XPath è sempre nullo per qualche motivo. Qualcuno può aiutare?

risposta

20

L'XPath è quasi corretto: non tiene conto dello spazio dei nomi XML predefinito sul nodo radice!

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

È necessario tenerne conto e modificare il codice come questo:

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

E poi il tuo XPath dovrebbe essere:

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

Ora, il vostro node_.InnerText dovrebbe sicuramente non essere più NULL!

+3

@ Nick Brooks: no, se c'è uno spazio dei nomi XML sull'elemento radice, allora il vostro Gli elementi XML di seguito che si trovano in quello spazio dei nomi, e quindi è necessario fare riferimento a loro utilizzando tale spazio dei nomi. Questo è l'intero punto dello spazio dei nomi XML: essere in grado di distinguere gli elementi XML del potenziale con lo stesso nome, inserendoli in spazi dei nomi specifici dell'applicazione o del fornitore. –

+1

Lo spazio dei nomi può essere aggiunto in questo modo, il che è un po 'meglio di codificare in modo rigido lo spazio dei nomi nsmgr.AddNamespace ("x", doc.DocumentElement.NamespaceURI); –

+0

Um, non possiamo in qualche modo impostarlo su (A) usare automaticamente tutti gli attributi 'xmlns', o (B) solo dire a .NET di ignorare gli spazi dei nomi e abbinare qualunque cosa vediamo letteralmente nel nostro file XML? Inoltre, da dove viene la stringa '" x "'? – Qwertie

0

Siamo spiacenti per la risposta in ritardo ma ho avuto un problema simile solo un momento fa.

se si vuole veramente di ignorare che namespace poi basta eliminarlo dalla stringa che si utilizza per inizializzare il 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;