如何获取作为另一个元素后代的多个 XML 元素
How to get multiple XML elements that are descendants of another element
我有一个 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();
我需要对上述内容做些什么才能获取订单中的所有商品并存储在另一个对象 属性(例如列表或类似对象)中?
例如
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
子元素,然后从该元素 select 它的所有 item
子元素,最后从该集合,投射到 Item
对象的集合,被物化为 List<Item>
并分配给 Order.Items
属性.
(注意:您将命名类型 Order
与代表 item
XML 元素的匿名类型混合;我修复了代码,以便它在任何地方都使用命名类型,但是如果你愿意,你当然可以在任何地方使用匿名。
我想你需要这个:-
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; }
}
根据名为 export 的根元素,我认为您可能试图 serialize/de-serialize 程序中的对象:
[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");
我有一个 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();
我需要对上述内容做些什么才能获取订单中的所有商品并存储在另一个对象 属性(例如列表或类似对象)中? 例如
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
子元素,然后从该元素 select 它的所有 item
子元素,最后从该集合,投射到 Item
对象的集合,被物化为 List<Item>
并分配给 Order.Items
属性.
(注意:您将命名类型 Order
与代表 item
XML 元素的匿名类型混合;我修复了代码,以便它在任何地方都使用命名类型,但是如果你愿意,你当然可以在任何地方使用匿名。
我想你需要这个:-
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; }
}
根据名为 export 的根元素,我认为您可能试图 serialize/de-serialize 程序中的对象:
[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");