Я пытаюсь извлечь информацию из 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"));
}
}
}
У вас есть несколько маленьких опечаток, на атрибуте 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"
Это возможно, но зависит от того, что вы пытаетесь сделать. Если это так:
| Выравнивание по левому краю Выравнивание по правому краю | в одной ячейке, то можно использовать плавающие дивы внутри тэга 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
со связанными предметами.