2011-10-24 19 views
61

Estoy creando una aplicación de ping para la escuela con un XML lleno de URL. Perdí una hora porque XmlNode.Value estaba dando como resultado un nulo.XmlNode Value vs InnerText

Luego lo cambié a InnerText y funcionó bien.

Ahora me pregunto cuál es la diferencia porque MSDN dice que .Value devuelve el valor del nodo y InnerText devuelve los valores concatenados del nodo y todos sus nodos secundarios.

¿Alguien puede explicar esto por favor?

<sites> 
<site> 
    <url>www.test.be</url> 
    <email>[email protected]</email> 
</site> 
<site> 
    <url>www.temp.be</url> 
    <email>[email protected]</email> 
</site> 
<site> 
    <url>www.lorim.ipsum</url> 
    <email>[email protected]</email> 
</site></sites> 
+6

Es posible que desee publicar una muestra de su archivo XML. –

+9

@FrazellThomas - las diferencias entre .Value y .InnerText se pueden entender fácilmente sin ver su XML –

+0

Si depura y utiliza la ventana inmediata, es posible que pueda ahorrarse mucho tiempo depurando cosas. Le permite ejecutar código basado en el contexto actual y escribirá todas las propiedades y sus valores de XElement. Este enfoque le permitiría echar un vistazo al gráfico de objetos y verificar que el valor es nulo, pero InnerText contiene su valor. Espero que esto ayude. –

Respuesta

74

Si, por ejemplo, el código XML se parece <Foo>Bar</Foo> luego "bar" en realidad se considera un nodo separado: un nodo XmlText (sub-clasificado de XmlNode). La propiedad Value de ese nodo XmlText sería "Bar".

"Foo" se considera un XmlElement (también subclasificado de XmlNode). XmlNode.Value devuelve cosas diferentes según el tipo de nodo que sea. Ver this table que muestra que Value siempre devuelve null para Element nodos.

El InnerText del nodo Foo devuelve "Barra" porque concatena los valores de sus elementos secundarios (en este caso, solo el nodo XmlText).

+23

Nota: el xpath para seleccionar el TextNode sería "Foo/text()" –

+0

Hola Robert! ¿Cómo puedo usar la serialización con esto?Si tomo su ejemplo Bar, tendré una clase llamada "Foo" pero, ¿qué propiedad debería tener para obtener una "Barra" serializada dentro de ella? – PlaTyPuS

0

En cuanto a MSDN, Value propiedad de XmlNodeType.Element devuelve:

nula. Puede usar las propiedades XmlElement.InnerText o XmlElement.InnerXml para acceder al valor del nodo del elemento.

+2

¿Es posible que .InnerXml para devolver nulo? A partir de mi breve prueba, no aparece así, por ejemplo, cuando creo un nodo, explícitamente asigno 'node.InnerXml = null;' y luego prueba 'node.InnerXml == null;' es falso. En cambio, 'node.InnerXml == string.Empty;' es verdadero. ¿Puedo confiar en este comportamiento? Los documentos de MSDN no dicen nada sobre esto. –

1

La especificación XML es muy exigente con la terminología y qué constituye qué tipo de objeto XML. Como se mencionó, element no tiene un valor. Esto es específico de attribute (y probablemente un par de otros tipos de nodos) porque attribute tiene una sintaxis que no es element, es decir, name='value'.

Si cree que es confuso, mire la diferencia entre el niño y el descendiente, o el nodo raíz y el elemento del documento.

+0

Simplemente más razones para abandonar XML para JSON. – CodeMonkey

7

Tuve una situación similar. Lo que hice fue seleccionar el primer hijo del nodo actual y verifiqué si era texto XML, y luego mostré su valor.

XmlNodeList xNList = xDOC.SelectNodes("//" + XMLElementname); 

foreach (XmlNode xNode in xNList) 
{ 
    if (xNode.ChildNodes.Count == 1 && 
     xNode.FirstChild.GetType().ToString() == "System.Xml.XmlText") 
    { 
     XMLElements.Add(xNode.FirstChild.Value); 
    } 
    else 
    { 
     XMLElements.Add("This is not a Leaf node"); 
    } 
}