如何获取作为另一个元素的后代的多个XML元素

时间:2015-01-14 03:47:39

标签: c# xml linq

我有一个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();

3 个答案:

答案 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");