web-dev-qa-db-ja.com

XmlNode値とInnerText

URLでいっぱいのXMLを使用して、学校用のpingアプリケーションを作成しています。 XmlNode.Valueがnullになったため、1時間失われました。

それからInnerTextに変更しましたが、うまくいきました。

MSDNは.Valueがノードの値を返し、InnerTextがノードとそのすべての子ノードの連結された値を返すとMSDNが言っているので、違いは何だろうと思いました。

誰かが私にこれを説明してもらえますか?

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

たとえば、XMLが<Foo>Bar</Foo>その後、「バー」は実際には別のノードと見なされます:XmlTextノード(XmlNodeからサブクラス化)。そのValueノードのXmlTextプロパティは「Bar」になります。

「Foo」はXmlElementXmlNodeからサブクラス化されている)と見なされます。 XmlNode.Valueは、ノードのタイプに基づいて異なるものを返します。 Valuenullノードに対して常にElementを返すことを示す this table を参照してください。

FooノードのInnerTextは、子の値(この場合は1つのXmlTextノードのみ)を連結するため、「Bar」を返します。

84
Robert Levy

同様の状況がありました。私がしたことは、現在のノードの最初の子を選択し、それがXMLtextであるかどうかを確認し、その値を表示したことです。

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

XML仕様は、用語と、どのタイプのXMLオブジェクトを構成するかについて非常に慎重です。前述のように、elementには値がありません。 attributeにはattributeにはない構文、つまりname='value'があるため、これはelement(およびおそらく他のいくつかのノードタイプ)に固有です。

混乱していると思われる場合は、子と子孫の違い、またはルートNodeとドキュメント要素!

1
Tom W

[〜#〜] msdn [〜#〜] に関して、ValueプロパティのXmlNodeType.Element 返却値:

ヌル。 XmlElement.InnerTextまたはXmlElement.InnerXmlプロパティを使用して、要素ノードの値にアクセスできます。

0
abatishchev

Url要素はリーフノードであるため、InnerText(InnerXml)プロパティには要素値が含まれます。要素ノードの場合、msdnのドキュメント https://msdn.Microsoft.com/en-us/library/system.xml.xmlnode.value(v = VS.110)に示されているように、valueプロパティはnullになります。 aspx

0