2009-04-30 30 views
5

Estoy trabajando con un documento XML que contiene una estructura que se parece a esto:¿Por qué SelectSingleNode devuelve nulo?

<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

estoy corriendo en un problema y sólo con éste documento en particular cuando trato de ejecutar la siguiente línea de código:

estoy en el equipo de perforación ¿Puedo rastrear adivinando que esto está devolviendo nulo debido a un problema con el uso de un atributo llamado 'id' o me falta algo en el código?

Respuesta

9

no puede replicar esta utilizando un archivo XML

<MT> 
    <Events> 
    <event id="1"> 
     <field name="blah" value="a_value" type="atype" /> 
    </event> 
    </Events> 
</MT> 

Y el 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.

actualización

Después de la adición de un xmlns="example.org" al elemento <MT>, tuve que configurar un gestor de espacio de nombres para el XPath y utilizar el espacio de nombres para el evento. No se pudo conseguir que el espacio de nombres predeterminado funcione 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 que me confunde cuando se trata de conseguir que esto funcione. ¿Por qué XmlNamespaceManager necesita XmlNameTable del documento si no es para descubrir qué espacios de nombres contiene? Como en, ¿por qué tengo que definir el NameTable y el espacio de nombres? Apreciaría si alguien que sabe podría lanzar un pequeño comentario.

+0

Respondiendo a mi propia pregunta. XmlNameTable se utiliza para optimizar las comparaciones de cadenas y supongo que la razón por la que puede darle a XmlNamespaceManager una tabla de nombres existente permite realizar comparaciones rápidas con los elementos de XmlDocument, ya que estos comparten el NameTable. –

+0

Su actualización parece tener sentido. Intentaba mostrar una forma abreviada de xml y olvidé publicar el espacio de nombres. Gracias por tomarse el tiempo extra para tratar de resolver esto. Una vez que eliminé el espacio de nombres del xml original, todo salió como debería. Definitivamente vale más estudiar el espacio de nombres System.Xml. –

Cuestiones relacionadas