2015-01-14 4 views
1

У меня есть документ 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/en-us/library/bb353813 (v = vs.110) .aspx) или ['XContainer.Elements()'] (http://msdn.microsoft.com/en-us/library/bb348975 (v = vs.110) .aspx) метод? –

ответ

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, я установил код так, что он использует именованный типы везде, но вы, конечно, можете использовать анонимным везде вместо этого, если вам нравится).

+0

Это сделало трюк! Я использовал вариацию вашего кода, поскольку у меня действительно есть объект Item, и у него есть несколько свойств, поэтому я использовал «Name = itemElement.Element (« name »). Значение» и т. Д. –

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; } 
} 
+1

Этот ответ работает отлично, однако Peter выложил сначала, так что это справедливо, я принимаю его. Спасибо за ответ! +1 –

0

на основе корневого элемента был назван экспорт, я думал, что вы, возможно, пытается сериализации/де -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"); 
Смежные вопросы