Linq to xml: узнать родителя? - PullRequest
       12

Linq to xml: узнать родителя?

1 голос
/ 24 февраля 2012

Я пытаюсь использовать XElement, чтобы узнать родительский узел атрибута Id.См. Пример ниже. Это мои данные.

<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();


        }

1 Ответ

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

Я чувствую, что ваш пример и то, что вы просите, не совпадают.Посмотрите, соответствует ли моя интерпретация тому, что вы ищете.

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
...