對象模型給出以下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 .....和在「一次通過」中?
這裏是我所擁有的........(我可以獲得「Order(s)」填充) ......但不知道如何得到孩子們?還是我必須拿2分接受它然後「匹配它們」?
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'元素的下面;然後你可以使用'item.Elements(「orderDetail」)'只提取'orderDetail'元素。另外,除了'orders'元素外的'root'元素還有別的東西,你可以使用'orders'作爲根元素。 –
好的。其一,這是我必須解析的XML的一個虛擬的例子。二,我無法控制輸入xml。但謝謝你的建議。 – granadaCoder