Учитывая ниже DTO определений:Родитель/Дети Xml в DTO модели объекта с помощью LINQ
[Serializable]
internal class OrderCollection : List<Order>
{ }
[Serializable]
internal class Order
{
public string OrderId { get; set; }
public OrderDetailCollection OrderDetails { get; set; }
}
[Serializable]
internal class OrderDetailCollection : List<OrderDetail>
{ }
[Serializable]
internal class OrderDetail
{
internal OrderDetail()
{
}
/*public string ParentOrderId { get; set; }*/
public string ItemName { get; set; }
public int Quantity { get; set; }
}
и следующий XML:
<root>
<orders>
<order orderId="ABC123">
<orderDetails>
<orderDetail itemName="Bike" quantity="1"/>
<orderDetail itemName="TeddyBear" quantity="2"/>
<orderDetail itemName="Doll" quantity="3"/>
</orderDetails>
</order>
<!-- -->
<order orderId="DEF234">
<orderDetails>
<orderDetail itemName="Truck" quantity="4"/>
<orderDetail itemName="Marbles" quantity="5"/>
<orderDetail itemName="BoardGame" quantity="6"/>
</orderDetails>
</order>
</orders>
</root>
Есть ли способ, чтобы заполнить всю модель объекта (в результате в одном объекте типа OrderCollection с использованием Linq ..... и в «одном проходе»?
Вот что у меня есть ........ (Я могу получить «заказ (ы)», ...... но не уверен, как получить детей? Или мне нужно взять 2 pas ses на нем, а затем «сопоставить их»?
XDocument xDoc = XDocument.Load(fullFileName);
//XNamespace ns = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");
string ns = string.Empty;
List<Order> lineItems = new List<Order>
(
from list in xDoc.Descendants(ns + "orders")
from item in list.Elements(ns + "order")
where item != null
select new Order
{
OrderId = item.Attribute("orderId") == null ? string.Empty : item.Attribute("orderId").Value
}
);
OrderCollection returnCollection = new OrderCollection();
returnCollection.AddRange(lineItems);
О структура XML - я думаю, вы можете поместить элементы 'orderDetail' непосредственно под элементами' order'; вы можете извлечь только элементы 'orderDetail', используя' item.Elements ("orderDetail") '. Кроме того, если у вас есть что-то еще в элементе 'root' кроме элемента' orders', вы можете использовать 'orders' в качестве корневого элемента. –
Хорошо. Во-первых, это необузданный пример xml, который я должен проанализировать. Во-вторых, у меня нет контроля над входным xml. Но спасибо за предложение. – granadaCoder