2011-10-24 17 views
61

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

次に、InnerTextに変更して正常に動作しました。

MSDNでは、.Valueはノードの値を返し、InnerTextはノードとそのすべての子ノードの連結値を返します。

誰かが私のためにこれを説明できますか? (XmlNodeからサブ分類)XmlTextノード:

<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]main.com</email> 
</site></sites> 
+6

XMLファイルのサンプルを投稿したい場合があります。 –

+9

@FrazellThomas - .Valueと.InnerTextの違いは、XMLを見なくても簡単に理解できます –

+0

デバッグして直接ウィンドウを使用すると、デバッグ作業に多くの時間を費やすことができます。現在のコンテキストに基づいてコードを実行し、XElementのすべてのプロパティとその値を書き出します。この方法では、オブジェクトグラフを簡単に見て、Valueがnullであることを確認できますが、InnerTextには値が含まれていることを確認できます。お役に立てれば。 –

答えて

74

は場合、たとえば、あなたのXMLは、「バー」は、実際に別のノードとみなされ<Foo>Bar</Foo>のように見えます。そのXmlTextノードのValueプロパティは "Bar"になります。

「Foo」は、XmlElement(サブクラスはXmlNode)であるとみなされます。 XmlNode.Valueは、ノードのタイプに基づいて異なるものを返します。 this tableを参照してください。Valueは、常にノードElementnullを返します。

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

+23

注:TextNodeを選択するためのxpathは "Foo/text()"となります –

+0

こんにちは!これでシリアル化を使用するにはどうすればよいですか?私があなたの例を取る場合バー、私は "Foo"と呼ばれるクラスを持っていますが、どのプロパティを "Bar"をその内部にシリアライズする必要がありますか? – PlaTyPuS

0

XmlNodeType.ElementリターンのValueプロパティ:

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

+2

.InnerXmlがnullを返すことは可能ですか?私が簡単にテストしたところでは、ノードを作成して明示的に 'node.InnerXml = null;'を指定し、 'node.InnerXml == null; 'をテストするとfalseになります。代わりに、 'node.InnerXml == string.Empty;'がtrueです。私はこれに頼ることができますか? MSDNのドキュメントはこれについて黙っています。 –

1

XML仕様は、用語とXMLオブジェクトの種類を構成する要素について非常に厄介です。前述のとおり、elementに値はありません。 attributeの構文はではないため、であるため、これはattribute(とおそらくいくつかの他のノードタイプ)に固有です。

混乱していると思われる場合は、子ノードと子孫、またはルートノードとドキュメント要素の違いをチェックしてください!

+0

JSON用にXMLを放棄する理由だけです。 – CodeMonkey

7

私は同様の状況がありました。私がしたのは、現在のノードの最初の子を選択し、それが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"); 
    } 
} 
関連する問題