2012-02-24 8 views
1

XElementを使用して属性Idの親ノードを検索しようとしています。Linq to xml:親を見つける?

<Data> 
     <Description>MASTER</Description> 
     <Data> 
     <Description>Parent1</Description> 
     <Data id="GUID1" Description="THIS IS A TEST" /> 
     <Data id="GUID2" Description="THIS IS A TEST" /> 
     <Data id="GUID3" Description="THIS IS A TEST" /> 
     </Data> 
     <Data> 
     <Description>Parent2</Description> 
     <Data id="GUID4" Description="THIS IS A TEST" /> 
     <Data id="GUID5" Description="THIS IS A TEST" /> 
     </Data> 
     <Data id="GUID6" Description="THIS IS A TEST" /> 
    </Data> 

は、私が「GUID6」と結果が GUID6 =「MASTER」のためとGUID1 =「MASTERParent1」のためになる「GUID1」両親を知りたい場合。これは私のデータをある 以下の例を参照してくださいが、私の結果は間違っています。誰かが私を助けることができますか?

私もそう、それはここで、「ドット」

は私のコード

protected void Page_Load(object sender, EventArgs e) 
     { 
      var s = "<Data><Description>MASTER</Description><Data><Description>PARENT1</Description><Data id=\"GUID1\" Description=\"THIS IS A TEST\" /><Data id=\"GUID2\" Description=\"THIS IS A TEST\" /><Data id=\"GUID3\" Description=\"THIS IS A TEST\" /></Data><Data><Description>PARENT2</Description><Data id=\"GUID4\" Description=\"THIS IS A TEST\" /><Data id=\"GUID5\" Description=\"THIS IS A TEST\" /></Data><Data id=\"GUID6\" Description=\"THIS IS A TEST\" /></Data>"; 
      var doc = XElement.Load(new StringReader(s)); 
      var result = (from data in doc.Descendants("Data").Where(x => x.Attribute("id") != null) 
          select new 
           { 
            Id = data.Attribute("id").Value, 
            Decription = data.Attribute("Description").Value, 
            Parent = data.Parent.Value 
           }).ToList(); 


     } 
+0

なぜ 'Parent2'がGUID6の親ですか? – sll

+0

よく見つかるあなたは間違ってその "マスター"を更新しました – user929153

答えて

3

である私のような感じ使用して、マスターと親を分割出力が「MASTER.Parent1」になりたいですあなたの例とあなたが求めているものは一致しません。私の解釈があなたが探しているものかどうかを見てください。この出力の

var s = @" 
<Data> 
    <Description>MASTER</Description> 
    <Data> 
     <Description>Parent1</Description> 
     <Data id=""GUID1"" Description=""THIS IS A TEST"" /> 
     <Data id=""GUID2"" Description=""THIS IS A TEST"" /> 
     <Data id=""GUID3"" Description=""THIS IS A TEST"" /> 
    </Data> 
    <Data> 
     <Description>Parent2</Description> 
     <Data id=""GUID4"" Description=""THIS IS A TEST"" /> 
     <Data id=""GUID5"" Description=""THIS IS A TEST"" /> 
    </Data> 
    <Data id=""GUID6"" Description=""THIS IS A TEST"" /> 
</Data>"; 

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

var desiredGuids = new List<string>{ "GUID1", "GUID6" }; 

var result = (from data in doc.Descendants("Data") 
      where data.Attribute("id") != null && desiredGuids.Contains((string)data.Attribute("id")) 
      select new { 
       Id = data.Parent.Element("Description").Value + "." + (string)data.Attribute("id"), 
       Description = (string)data.Attribute("Description"), 
       Parent = data.Parent.Element("Description").Value 
      }); 

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

結果

Parent1.GUID1 THIS IS A TEST 
MASTER.GUID6 THIS IS A TEST 
+0

ファンタスティック! :-)私はparent.element( "Description")を使用することに気づきませんでした。 – user929153