LINQ к XML выбор дочерних элементов

Я пытаюсь извлечь информацию из XML-файла в объект с помощью LINQ для XML. Хотя я могу возвратить документ и атрибуты раздела Id, я не могу получить доступ к Объектам для каждого элемента раздела, он возвращает IEnumerable всех объектов в документе. Я знаю, что это корректно, как я звоню Потомкам, но изо всех сил пытаюсь заставить это возвращать только дочерние объекты каждого элемента раздела. Кто-либо может помочь?

XML-документ

<root>
<document id="1">
  <section id="1.1">
    <item id="1.1.1"></item>
    <item id="1.1.2"></item>
    <item id="1.1.3"></item>
  </section>
  <section id="1.2">
    <item id="1.2.1"></item>
    <item id="1.2.2"></item>
  </section>
</document>
</root>

Запрос LINQ

XElement documentRoot = XElement.Load("document.xml");
var documents = (from docs in documentRoot.Descendants("document")
                 select new
                    {
                        Id = (string) docs.Attribute("id"),
                        Sections = docs.Elements("section"),
                        Items = docs.Elements("section").Elements("item")
                    }).ToList();

foreach(var doc in documents)
{
    foreach(var section in doc.Sections)
    {
        Console.WriteLine("SectionId: " + section.Attribute("Id"));  
        foreach(var item in doc.Items)
        {
            Console.WriteLine("ItemId: " + section.Attribute("Id"));
        }
    }
}
5
задан LINQ 15 October 2015 в 19:54
поделиться

2 ответа

У вас есть несколько маленьких опечаток, на атрибуте ID и на цикле элемента. Но если вы пытаетесь получить все элементы раздела в эту коллекцию предметов, вы не правы на уровне проектирования, поскольку элементы должны быть раздела , а не документ (Так что вам нужно запросить свой XML дважды).

Или вы можете сделать что-то вроде:

var documents =
    (from docs in documentRoot.Descendants("document")
     select new
     {
         Id = (string) docs.Attribute("id"),
         Sections = docs.Elements("section")
     }).ToList();

foreach (var doc in documents)
{
    foreach (var section in doc.Sections)
    {
        Console.WriteLine("SectionId: " + section.Attribute("id"));
        foreach (var item in section.Elements("item"))
        {
            Console.WriteLine("ItemId: " + item.Attribute("id"));
        }
    }
}

Выход:

SectionId: id="1.1"
ItemId: id="1.1.1"
ItemId: id="1.1.2"
ItemId: id="1.1.3"
SectionId: id="1.2"
ItemId: id="1.2.1"
ItemId: id="1.2.2"
7
ответ дан 14 December 2019 в 01:08
поделиться

Это возможно, но зависит от того, что вы пытаетесь сделать. Если это так:

| Выравнивание по левому краю Выравнивание по правому краю | в одной ячейке, то можно использовать плавающие дивы внутри тэга td:

<td>
<div style='float: left; text-align: left'>Left-aligned</div>
<div style='float: right; text-align: right'>Right-aligned</div>
</td>

Если это | Выравнивание влево
Выровнено вправо |

Тогда решение Балона правильное.

Если это: | Выравнивание по левому краю | Выравнивание по правому краю |

Тогда это:

<td align="left">Left-aligned</td>
<td align="right">Right-Aligned</td>
-121--1073093-

Вы получили небольшие опечатки, на атрибуте Id и на предмете цикле. Но если вы пытаетесь получить все предметы раздела в эту коллекцию предметов, вы ошибаетесь на уровне разработки, так как Предметы должно быть свойством Раздел , а не Документ (поэтому вам потребуется дважды запросить XML).

Или вы можете сделать что-то вроде:

var documents =
    (from docs in documentRoot.Descendants("document")
     select new
     {
         Id = (string) docs.Attribute("id"),
         Sections = docs.Elements("section")
     }).ToList();

foreach (var doc in documents)
{
    foreach (var section in doc.Sections)
    {
        Console.WriteLine("SectionId: " + section.Attribute("id"));
        foreach (var item in section.Elements("item"))
        {
            Console.WriteLine("ItemId: " + item.Attribute("id"));
        }
    }
}

Вывод:

SectionId: id="1.1"
ItemId: id="1.1.1"
ItemId: id="1.1.2"
ItemId: id="1.1.3"
SectionId: id="1.2"
ItemId: id="1.2.1"
ItemId: id="1.2.2"
-121--4817869-

Хотите плоскую структуру?!?! (от LinqPad)

XElement documentRoot  = XElement.Parse (
@"<root> 
<document id='1'> 
  <section id='1.1'> 
    <item id='1.1.1'></item> 
    <item id='1.1.2'></item> 
    <item id='1.1.3'></item> 
  </section> 
  <section id='1.2'> 
    <item id='1.2.1'></item> 
    <item id='1.2.2'></item> 
  </section> 
</document> 
</root> 
");




var documents = (from docs in documentRoot.Descendants("section") 
                 select new 
                    { 
                        SectionId = (string) docs.Attribute("id"), 
                        Items = docs.Elements("item") 
                    }); 
 documents.Dump();

Это дает 2 SureId предметов, который содержит XElement со связанными предметами.

2
ответ дан 14 December 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: