2012-02-24 66 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”和“GUID1”父母的结果将是GUID6 =“MASTER” 和GUID1 =“MASTERParent1”,但我的结果不正确。请有人可以帮助我。

我也希望可以将输出为“MASTER.Parent1”所以它通过使用“点”

这里分割了主,父是我的代码

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 2012-02-24 15:01:06

+0

斑点。你对错了它的“主人”我已经更新了 – user929153 2012-02-24 15:07:03

回答

3

我觉得你的例子和你要求的东西不匹配。看看我的解读是你在找什么。

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

Fantastico! :-)谢谢我没有意识到使用parent.element(“说明”)。值谢谢我在这上面花了很多时间。 – user929153 2012-02-24 15:12:58