如何获得多个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(); 
+0

如果你想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)方法? –

我不完全确定你要做什么。但是,我想可能是这样的:

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元素的匿名类型混合;我修复了代码,以便它在任何地方都使用指定类型,但如果您喜欢,您当然可以使用匿名匿名方式)。

+0

这个伎俩!我使用了代码的变体,因为我确实有一个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

首先发布,这是公平的,我接受他的。感谢你的回答! +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");