如何找到孩子的父母?

时间:2012-02-27 13:13:31

标签: c# xml linq architecture xelement

我正在尝试使用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>

所以父母(国王)有两个孩子迈克和大卫。我想要的是找出谁是“大卫”的父母我怎么能找到这个呢?

以下是我的代码:

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"的整个父结果,这是错误的。如何在没有孩子的情况下返回“国王”?

2 个答案:

答案 0 :(得分:3)

data.Parent.Parent指的是整个Data元素,其值是其后代的组合值。您需要其Description子项的值:

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

答案 1 :(得分:0)

我不确定LINQ但是如果它不起作用你可以使用XPATH来做到这一点。 http://www.codeproject.com/Articles/9494/Manipulate-XML-data-with-XPath-and-XmlDocument-C特别在中间看到表达式表。你需要像这样的表达方式。

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