Linq to XML Вложенные теги объединяются - PullRequest
1 голос
/ 11 марта 2011

У меня есть XML, который выглядит так

<Labs>
  <Lab id="a" name="a">
    <Test name="aa"></Test>
    <Test name="ab"></Test>
    <Test name="ac"></Test>
  </Lab>
  <Lab id="b" name="b">
    <Test name="ba"></Test>
    <Test name="bb"></Test>
  </Lab>
</Labs>

Я хочу получить данные из этого XML в одной таблице, используя LINQ to XML, с помощью одного оператора select. Если бы вы могли предоставить мне ссылку на то, как сделать запрос.

Я связываю вывод запроса Linq to XML с сеткой silverlight. Вывод должен быть таким в silverlight ...

LabName    TestName
a          aa
a          ab
a          ac
b          ba
b          bb

Ответы [ 2 ]

1 голос
/ 11 марта 2011

ОК, вот рабочий пример:

string xml =@"<Labs>
  <Lab id='a'>
    <Test name='aa'></Test>
    <Test name='ab'></Test>
    <Test name='ac'></Test>
  </Lab>
  <Lab id='b'>
    <Test name='ba'></Test>
    <Test name='bb'></Test>
  </Lab>
</Labs>";

XDocument document = XDocument.Parse(xml);
IEnumerable<XElement> xElements = document.Descendants().Where(e => e.Name == "Test");
var results =  xElements.Select(m => new
                                        {
                                            Test = m.Attributes("name").FirstOrDefault().Value, 
                                                    Lab =m.Parent.Attributes("id").FirstOrDefault().Value
                                        });
        foreach (var result in results)
{
            Console.Write(result.Lab);
            Console.Write('\t');
            Console.WriteLine(result.Test);
}
0 голосов
/ 15 марта 2011

для лямбда-версии вышеприведенного решения, опубликованной Aliostad.Вы также можете использовать это ...

        var Tests = from tests in doc.Descendants("Test")
                    where tests.Attributes().Count() > 0
                    select new LabTestModel
                                {
                                    LabName = tests.Parent.Attribute("Name").Value,
                                    TestName = tests.Attribute("Name").Value
                                };
...