Как узнать родителя ребенка? - PullRequest
0 голосов
/ 27 февраля 2012

Я пытаюсь использовать 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 ]

3 голосов
/ 27 февраля 2012

data.Parent.Parent относится ко всему элементу Data, а его значением является совокупное значение его потомков.Вам нужно значение его Description потомка:

Parent = data.Parent.Parent == null ? null :
    data.Parent.Parent.Element("Description").Value
0 голосов
/ 27 февраля 2012

Я не уверен в 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
...