2016-10-12 16 views
1

現在のノードに値があるかどうか、またはXMLが埋め込まれているかどうかをXMLドキュメントの各ノードを反復しながら(再帰的に)判断するのは困難です。XmlDocumentの各ノードに含まれる内容を反復する

どちらの場合もXmlNode.NodeTypeがElementに設定されているようですが、XMLに値がありXMLでない場合、ChildNodes.Countはnullではありません(実際は1です)。

私はテストのために使用している単純なXMLファイルには、次のとおりです。

<note> 
    <to>You</to> 
    <from>Me</from> 
    <subject>Hello!</subject> 
    <body>Check out this cool data!</body> 
    <data> 
    <name>Something cool</name> 
    <location>Mars</location> 
    <distance>54 million kilometers</distance> 
    </data> 
</note> 

XMLNodeの各

は、上記の「要素」であるとのChildNodesと> = 1

私は確実にテストするために使用することができますどのようなXmlNodeをコンテナ(メモやデータのような)として扱うか、(from、from、subject、body、name、location、distanceのような)値を保持する必要がある場合

答えて

1

あなたがここにSystem.Xml.Linq.XElementの代わりXmlDocumentを使用できるかどうかは分かりませんが、あなたができるならば、あなたはこのことについて、次の道を行くことができます。

var xml = XElement.Parse("<note> .... </note>"); 

その後、

xml.Elements().Count() 

戻り5サブノードの正しい数。

xml.Elements().First().Elements().Count() 

は、toノードにゼロの子があるため、0を返します。

+0

これはうまくいくかもしれません、私は子供のために容器のために使うことができるforeachはありますか? – joelc

+1

@joelcあなたは普通のforeachを書くことができます - foreach(xml.Elements())内のvar要素{/ * your code * /} ' – TKharaishvili

1

通常、XMLの構造を知ることによって、どのノードに値が含まれているかを知っています。

TEXTノードとCDATAノードで表されるテキスト(構造体のXMLからの情報)を推測する必要がある場合、要素に「テキストのみ」ノードを取得するためのタイプの子しかないかどうかを確認できます。 How to get text inside an XmlNodeを参照してください。あなたも一緒に何をしたいかを決める -

  • 混合コンテンツノード(<r>foo <v/> bar</r>):

    いくつかの落とし穴が決定に関する作る/の注意すべき。私。 HTMLコンテンツを持つノードには、通常、「混合コンテンツ」が含まれます。

  • 要素間の有意な空白を表すテキストノード(<r> <n/> </r>)。文書の書式を維持する必要がある場合を除き、無視する必要があります。
  • 複数のノードが1つのテキストを表します。 XMLが読み込まれたり構築される方法によっては、単一のテキストではなく、子のテキストノードの集合で表すことができます。
+0

を私は構造については何も知りません。しかし、ありがとう! – joelc

0

例では、最初の子ノードがElementであることを確認できます。

bool isContainer(XmlNode node) { 
    return node.ChildNodes.Count > 0 && node.ChildNodes[0].NodeType == XmlNodeType.Element; 
} 

これは、混在コンテンツデータを処理しないことに注意してください。

関連する問題