我正在尝试将xml解析为对象的层次结构,而我不确定如何正确地递归层次结构。我确实有一个粗略的解决方案(不是一个好的解决方案),它是对GetChild的调用,它解析XElement并返回一个集合。我希望有人知道如何在纯粹的linq表达式中实现这一点,即。将Parent-Child-Item关系填充到List中,而不调用GetChild()
之类的函数由于
var element = XElement.Parse(@"<Root RegisterVersion='1.0' xmlns='http://www.test.com.au/docs/schemas' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.test.com/docs/schemas/spin/surcharge http://www.test.com/docs/schemas/test.xsd'>
<Parent id='1' name='parent1'>
<Child id='1' name='child1'>
<Item id='1' name='someitem'></Item>
</Child>
</Parent>
<Parent id='2' name='parent2'>
<Child id='2' name='child2'>
<Item id='2' name='someotheritem'></Item>
</Child>
</Parent>
</Root>
");
XNamespace ns = element.Name.Namespace;
var list =
from compileItem in element.Elements (ns + "Parent")
select new Parent
{
Id = compileItem.Attribute("id").Value.ToString(),
Name = compileItem.Attribute("name").Value.ToString(),
children = GetChild(compileItem)
// this call here I'd like to replace with another linq select
};
public List<Child> GetChild(XElement frag)
{
//etc
}
public List<Item> GetItem(XElement frag)
{
//etc
}
答案 0 :(得分:1)
小控制台app.Honestly,它的功能更具可读性。
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public List<Child> Childrens { get; set; }
}
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
public List<Item> Items { get; set; }
}
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
internal class Program
{
private class ADSetupInformation
{
public static void Main()
{
var element =
XElement.Parse(
@"<Root RegisterVersion='1.0' xmlns='http://www.test.com.au/docs/schemas' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.test.com/docs/schemas/spin/surcharge http://www.test.com/docs/schemas/test.xsd'>
<Parent id='1' name='parent1'>
<Child id='1' name='child1'>
<Item id='1' name='someitem'></Item>
</Child>
</Parent>
<Parent id='2' name='parent2'>
<Child id='2' name='child2'>
<Item id='2' name='someotheritem'></Item>
</Child>
</Parent>
</Root>
");
XNamespace ns = element.Name.Namespace;
var list =
element.Elements(ns + "Parent")
.Select(compileItem => new Parent
{
Id = Convert.ToInt32(compileItem.Attribute("id").Value),
Name = compileItem.Attribute("name").Value,
Childrens = compileItem.Elements(ns + "Child")
.Select(child => new Child
{
Id = Convert.ToInt32(child.Attribute("id").Value),
Name = child.Attribute("name").Value,
Items = child.Elements(ns + "Item")
.Select(xe => new Item()
{
Id = Convert.ToInt32(xe.Attribute("id").Value),
Name = xe.Attribute("name").Value,
}).ToList()
}).ToList()
});