我有一个XML文档,可以在另一个元素下有多个子元素,我想知道如何获取所有这些元素并存储为对象?例如 -
<?xml version="1.0" encoding="utf-8" ?>
<export>
<order>
<ordernumber>100</ordernumber>
<items>
<item>
<name>table</name>
</item>
<item>
<name>chair</name>
</item>
</items>
</order>
</export>
所以说我使用LINQ获取所有订单并存储在列表中
var xdoc = XDocument.Load(myXMLReader);
var result = (from x in xdoc.Root.Elements()
select new Order
{
OrderNumber = (string)x.Element("OrderNumber")
}).ToList();
我需要做些什么来获取订单中的所有商品并存储在另一个对象属性(如List或类似的东西)中? EG。
var result = (from x in xdoc.Root.Elements()
select new Order
{
OrderNumber = (string)x.Element("OrderNumber")
//PSUEDO CODE ADDITION
Items = (new { Name = itemname}).ToList()
// END PSUEDO CODE ADDITION
}).ToList();
答案 0 :(得分:2)
我不完全确定你要做什么。但我认为可能是这样的:
var result = (from x in xdoc.Root.Elements()
select new Order
{
OrderNumber = (string)x.Element("ordernumber"),
Items = x.Element("items")
.Elements("item")
.Select(itemElement =>
new Item { Name = itemElement.Value })
.ToList()
}).ToList();
换句话说:对于给定的元素,首先找到一个items
子元素,然后从该元素中选择所有的item
子元素,最后从该集合中投影到Item
个对象的集合,实现为List<Item>
并分配给Order.Items
属性。
(注意:您正在将命名类型Order
与表示item
XML元素的匿名类型混合;我修复了代码,以便它在任何地方使用命名类型,但您当然可以使用匿名如果你愿意的话,到处都是。
答案 1 :(得分:2)
我认为你需要这个: -
List<Order> orders = xdoc.Descendants("order")
.Select(x => new Order
{
OrderNumber = (string)x.Element("ordernumber"),
Items = x.Descendants("item")
.Select(i => new Item
{
Name = (string)i.Element("name") }).ToList()
}).ToList();
我已使用过类型: -
public class Order
{
public string OrderNumber { get; set; }
public List<Item> Items { get; set; }
}
public class Item
{
public string Name { get; set; }
}
答案 2 :(得分:0)
基于名为export的根元素,我想你可能会尝试序列化/反序列化程序中的对象:
[XmlRoot("export")]
public class Export
{
[XmlElement("order")]
public Order order {get; set;}
}
public class Order
{
[XmlElement("ordernumber")]
public int orderNumber { get; set; }
[XmlArray("items"), XmlArrayItem("item")]
public Item[] items { get; set; }
}
public class Item
{
public string name { get; set; }
}
static void Serialize(string file, Export export)
{
var serializer = new XmlSerializer(typeof(Export));
using (var stream = File.Create(file))
serializer.Serialize(stream, export);
}
static Export Deserialize(string file)
{
var serializer = new XmlSerializer(typeof(Export));
using (var stream = File.OpenRead(file))
return (Export) serializer.Deserialize(stream);
}
你会这样称呼:
var export = new Export
{
order = new Order
{
orderNumber = 100,
items = new[]
{
new Item {name = "table"},
new Item {name = "chair"}
}
}
};
Serialize("exported_orders.xml", export);
并且像这样:
var export = Deserialize("exported_orders.xml");