2017-07-07 37 views
3

これはインターネット上で見つかりました。C#XMLファイルの親要素、子要素を特定します

string xml = @" 
<food> 
    <child> 
    <nested /> 
    </child> 
    <child> 
    <other> 
    </other> 
    </child> 
</food> 
"; 

XmlReader rdr = XmlReader.Create(new System.IO.StringReader(xml)); 
while (rdr.Read()) 
{ 
    if (rdr.NodeType == XmlNodeType.Element) 
    { 
    Console.WriteLine(rdr.LocalName); 
    } 
} 

上記の結果は、これは完璧に働いている

food 
child 
nested 
child 
other 

なり、ちょうど私は、子要素が含まれている要素を特定する必要があります。

例えば、私は子要素をチェックするために、この出力

startParent_food 
    startParent_child 
     nested 
    endParent_child 
    startParent_child 
     other 
    endParent_child 
endParent_food 
+0

要件は不明です。 ** ''と ''を除くすべての要素**には、子要素が含まれています。 – Tomalak

+0

@Tomalak実際には、私は別の値でXMLの同じ構造をリメイクしたいので...親が子を持っているかどうかを確認する必要があります。 –

答えて

4

これはXmlReaderで行うことができますが、それは特に簡単ではありません。要素が子要素を持っているかどうかは分かりません。そのため、さまざまな要素をバッファリングして追跡する必要があります(XmlReaderは転送専用です)。このような低レベルのAPIを使用する正当な理由がない限り、私はあなたがそれを回避することを強く勧めます。

これはXMLにLINQとかなり簡単です

あなたがあなたのコメントに暗示として、あなたの実際の要件は、あなたがの詳細を処理する必要なしにこれを行うことができますし、いくつかの値を変更することで、場合
private static void Dump(XElement element, int level) 
{ 
    var space = new string(' ', level * 4); 

    if (element.HasElements) 
    { 
     Console.WriteLine("{0}startParent_{1}", space, element.Name); 

     foreach (var child in element.Elements()) 
     { 
      Dump(child, level + 1); 
     } 

     Console.WriteLine("{0}endParent_{1}", space, element.Name); 
    } 
    else 
    { 
     Console.WriteLine("{0}{1}", space, element.Name); 
    } 
} 

XML構造。たとえば、あなたのnested要素の値を変更するには:

var doc = XDocument.Parse(xml); 

var target = doc.Descendants("nested").Single(); 

target.Value = "some text"; 

var result = doc.ToString(); 

は、両方のデモのためthis fiddleを参照してください。

+0

woww !!本当にすごい...!私はそれに時間を費やしている... :) –

+0

はい先生、しかし実際には、同じ名前の2つ以上の要素があるかもしれません...異なる親ノードと....それは可能ですか?詳細なプロセスなしで?? –

+1

@jiyaaliはい、パスを明示的に指定することができます。 'doc.Descendants(" child ")。要素("入れ子 ")。Single()'。 LINQ to XMLのドキュメントやチュートリアルを読むことをお勧めします。 –

0

を必要とし、あなたのコードは以下のようになります。

System.Xml.Linq.XElement _x; 
    _x = System.Xml.Linq.XElement.Parse(xml); 

    if (_x.HasElements) 
    { 
     // your req element 
    } 

あなたはそれがすべての要素をチェックするために再帰的にする必要があります。

関連する問題