web-dev-qa-db-fra.com

Valeur XmlNode vs InnerText

Je crée une application de ping pour l'école avec un XML rempli d'URL . J'ai perdu une heure à cause de XmlNode.Value qui donnait la valeur null. 

Ensuite, je l'ai changé en InnerText et cela a bien fonctionné. 

Je me demandais maintenant quelle était la différence, car MSDN indique que .Value renvoie la valeur du nœud et que InnerText renvoie les valeurs concaténées du nœud et de tous ses nœuds enfants.

Quelqu'un peut-il expliquer cela pour moi s'il vous plaît?

<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>
67
Tom Kerkhove

Si, par exemple, votre code XML ressemble à <Foo>Bar</Foo>, "barre" est en fait considéré comme un nœud distinct: un nœud XmlText (sous-classé dans XmlNode). La propriété Value de ce noeud XmlText serait "Bar".

"Foo" est considéré comme un XmlElement (également sous-classé de XmlNode). XmlNode.Value renvoie différentes choses en fonction du type de nœud qu'il est. Voir ce tableau qui montre que Value renvoie toujours null pour les nœuds Element

La InnerText du nœud Foo renvoie "Bar" car elle concatène les valeurs de ses enfants (dans ce cas, seul le nœud XmlText).

81
Robert Levy

J'ai eu une situation similaire. Ce que j'ai fait, c'est que j'ai sélectionné le premier enfant du nœud actuel et vérifié s'il s'agissait de XMLtext, puis affiché sa valeur.

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");
    }
}
7
Santhosh Murali

La spécification XML est très pointilleuse sur la terminologie et sur ce qui constitue quel type d'objet XML. Comme mentionné, element n'a pas de valeur. Ceci est spécifique à attribute (et probablement à quelques autres types de nœuds) car attribute a une syntaxe que element n’a pas, c’est-à-dire name='value'

Si vous pensez que cela crée de la confusion, vérifiez la différence entre enfant et descendant, ou entre le nœud racine et l'élément de document!

1
Tom W

En ce qui concerne MSDN , la propriété Value de XmlNodeType.Element renvoie:

nul. Vous pouvez utiliser les propriétés XmlElement.InnerText ou XmlElement.InnerXml pour accéder à la valeur du nœud de l'élément. 

0
abatishchev

L'élément url étant le nœud feuille, la propriété InnerText (également InnerXml) contient la valeur de l'élément. Pour les nœuds d'élément, la propriété value sera null, comme indiqué dans la documentation msdn https://msdn.Microsoft.com/en-us/library/system.xml.xmlnode.value(v=VS.110).aspx .

0
Girish Reddyvari