¿Por qué SelectSingleNode devuelve nulo?
-
03-07-2019 - |
Pregunta
Estoy trabajando con un documento XML que contiene una estructura similar a esta:
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
.
.
.
</event>
</Events>
</MT>
Actualmente estoy cargando esto desde un archivo en un documento XML de esta manera:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("somefile.xml"); //Successfully loads btw
Sin embargo, me encuentro con un problema y solo con este documento en particular cuando intento ejecutar la siguiente línea de código:
xdoc.SelectSingleNode("//event[@id='1']"); //This returns a null
¿Estoy en el camino correcto al adivinar que esto está volviendo nulo debido a un problema con el uso de un atributo llamado 'id' o me falta algo en el código?
Solución
No puedo replicar esto usando un archivo XML
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
</event>
</Events>
</MT>
Y código
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\test.xml");
XmlNode node = doc.SelectSingleNode("//event[@id='1']");
Esto devuelve un nodo no nulo como se esperaba.
Update
Después de agregar un xmlns="example.org"
al elemento <MT>
, tuve que configurar un administrador de espacio de nombres para XPath y usar el espacio de nombres para el evento. No se pudo obtener el espacio de nombres predeterminado por alguna razón.
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\test.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("e", "http://example.org");
XmlNode node = doc.SelectSingleNode("//e:event[@id='1']", manager);
Una cosa me confundió al tratar de hacer que esto funcionara. ¿Por qué XmlNamespaceManager necesita XmlNameTable del documento si no es para averiguar qué espacios de nombres contiene? Como en, ¿por qué necesito definir la NameTable y el espacio de nombres? Agradecería si alguien que sabe puede dejar un breve comentario.