2012-02-27 8 views
0

私は子供の親ノードを見つけるためにXElementを使用しようとしています。以下の例を参照してください。これは私のデータです:子供の親を見つける方法は?

<Data> 
    <Description>King</Description> 
    <Data> 
     <Description>Mike</Description> 
     <Data id="GUID1" Description="THIS IS A TEST" /> 
    </Data> 
    <Data> 
     <Description>David</Description> 
     <Data id="GUID2" Description="THIS IS A TEST" /> 
     <Data id="GUID3" Description="THIS IS A TEST" /> 
    </Data> 
    <Data id="GUID4" Description="THIS IS A TEST" /> 
</Data> 

したがって、親(キング)には2人の子供、マイクとデイビッドがいます。私が欲しいのは、「デイヴィッド」の親である人を見つけることです。これをどのように見つけることができますか?ここで

は、以下の私のコードです:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var s = 
    @"<Data> 
      <Description>King</Description> 
      <Data> 
      <Description>Mike</Description> 
      <Data id=""GUID1"" Description=""THIS IS A TEST"" /> 
      </Data> 
      <Data> 
      <Description>David</Description> 
      <Data id=""GUID2"" Description=""THIS IS A TEST"" /> 
      <Data id=""GUID3"" Description=""THIS IS A TEST"" /> 
      </Data> 
      <Data id=""GUID4"" Description=""THIS IS A TEST"" /> 
     </Data>"; 

    var doc = XElement.Load(new StringReader(s)); 

    var result = (from data in doc.Descendants("Data") 
        where (string)data.Attribute("id") != null 
        select new 
        { 
         Id = data.Attribute("id").Value, 
         Decription = data.Attribute("Description").Value, 
         Child = data.Parent.Element("Description").Value, 
         Parent = data.Parent.Parent.Value **** THIS LINE **** 
        }); 

    foreach (var element in result) 
    { 
     Console.WriteLine("{0} {1}", element.Id, element.Decription); 
    } 
} 

私は運以外のすべてを試してみました。私はdata.Parent.Parent.Value ="KingMikeDavid"の親の結果全体が間違っています。子どもなしでちょうど "キング"を返すにはどうすればいいですか?

答えて

3

data.Parent.Parentは、Data要素全体を指し、その値はその子孫の合計値です。

Parent = data.Parent.Parent == null ? null : 
    data.Parent.Parent.Element("Description").Value 
+0

私は別のXMLファイルの行<データID =「」GUID4「」説明=「」これはテストです「」/>更新されたバージョンを参照してくださいを追加するのを忘れ申し訳ありません。これはヌル実行をスローしますか? – user929153

+0

しかし、この要素は一番上のデータ要素の子であり、それは王に属している、言い換えれば、親を持たない...。私はこのケースの答えを編集しました。 – user1096188

+0

ありがとうございました。 :-)これで時間の多くを費やしました.. – user929153

0

私はLINQのわからないんだけど、それが動作しない場合は、これを行うにはXPATHを使用することができます:あなたはそのDescription子の値を必要とします。 http://www.codeproject.com/Articles/9494/Manipulate-XML-data-with-XPath-and-XmlDocument-C特に表現表を真ん中に表示します。この表現のようなものが必要です。

/catalog/cd[last()] //selects the last cd child of catalog 
+0

それは何のために私は感謝を探しています私はXElementを使用して – user929153

関連する問題