如何获得多个XML元素是另一个元素的后代
我有一个XML文档,可以在另一个元素下有多个子元素,我想知道如何获得所有这些元素并存储为对象?对于示例 -如何获得多个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();
什么我需要做的,上面获得的另一个订单中的所有项目和存储对象属性,如列表或类似的东西? 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();
我不完全确定你要做什么。但是,我想可能是这样的:
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元素的匿名类型混合;我修复了代码,以便它在任何地方都使用指定类型,但如果您喜欢,您当然可以使用匿名匿名方式)。
这个伎俩!我使用了代码的变体,因为我确实有一个Item对象,它有多个属性,所以我使用了“Name = itemElement.Element(”name“)。Value”等等。 –
我认为你需要这样的: - 我已经使用
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; }
}
首先发布,这是公平的,我接受他的。感谢你的回答! +1 –
基于根元素被命名为出口,我想你可能会尝试序列化/解
[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);
}
你会这样称呼它:在你的程序-serialize对象
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");
如果你想XML转换为对象,它往往简单到只需要声明一个类型为'[Serializable接口]'和反序列化XML代入式(或代理以某种方式复制到真实类型的类型)。就直接处理XML而言,是否查看了['XContainer.Descendants()'](http://msdn.microsoft.com/zh-cn/library/bb353813(v = vs.110).aspx )或['XContainer.Elements()'](http://msdn.microsoft.com/en-us/library/bb348975(v = vs.110).aspx)方法? –