Si consideri questo semplice documento XML. L'XML serializzato mostrato qui è il risultato di un XmlSerializer da un oggetto POCO complesso il cui schema non ho controllo.SelectSingleNode restituisce null per il percorso del nodo xml valido con XPath
<My_RootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
<id root="2.16.840.1.113883.3.51.1.1.1" extension="someIdentifier" xmlns="urn:hl7-org:v3" />
<creationTime xsi:nil="true" xmlns="urn:hl7-org:v3" />
</My_RootNode>
L'obiettivo è estrarre il valore dell'attributo di estensione sul nodo id. In questo caso, stiamo usando il metodo SelectSingleNode, e dato un'espressione XPath come tale:
XmlNode idNode = myXmlDoc.SelectSingleNode("/My_RootNode/id");
//idNode is evaluated to null at this point in the debugger!
string msgID = idNode.Attributes.GetNamedItem("extension").Value;
Il problema è che il metodo SelectSingleNode
restituisce null per la data espressione XPath.
Domanda: tutte le idee su correttezza di questa query XPath, o perché questa chiamata al metodo + un'espressione XPath sarebbe tornato un valore nullo? Forse gli spazi dei nomi fanno parte del problema?
La prima cosa da verificare è se il documento XML è stato caricato correttamente. Posso vedere un attributo xmlns vuoto alla fine del nodo root - è vero? – Oded
@Oded: corretto, stiamo esaminando un XmlDocument che ha caricato l'output di stringa di un XmlSerializer. –
@pcampbell: è un documento di grandi dimensioni (HL7!)? Se è così, allora potresti provare a serializzare direttamente in XmlDocument. Se vuoi un esempio, fammi sapere. –