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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top