如何使用LINQ to XML解析深度嵌套 [英] How to parse deeply nested using LINQ to XML
问题描述
如何使用LINQ解析以下XML?
我需要为每个 Order &插入数据库表 OrderNumber,ShipAddress,ShipCity,ShipState . OrderCancelled .
然后在另一个表格中,我需要从退货/金额部分插入 OrderId .
How do I parse the following XML using LINQ?
I need to insert into a database table OrderNumber, ShipAddress, ShipCity, ShipState for each Order & OrderCancelled.
Then in a separate table I need to insert OrderId from the Returns/Amount section.
<!-- language: lang-xml -->
<?xml version="1.0" encoding="utf-8"?>
<OrdersReport Date="2012-08-01">
<Client>
<ClientId>1</ClientId>
<Orders>
<Order>
<OrderNumber>1</OrderNumber>
<ShipAddress>123 Main St.</ShipAddress>
<ShipCity>MyCity</ShipCity>
<ShipState>AZ</ShipState>
</Order>
<Order>
<OrderNumber>2</OrderNumber>
<ShipAddress>111 Main St.</ShipAddress>
<ShipCity>OtherCity</ShipCity>
<ShipState>AL</ShipState>
</Order>
<OrderCancelled>
<OrderNumber>3</OrderNumber>
<ShipAddress>111 Main St.</ShipAddress>
<ShipCity>OtherCity</ShipCity>
<ShipState>AL</ShipState>
</OrderCancelled>
</Orders>
<Returns>
<Amount>
<OrderId>2</OrderId>
<OrderId>3</OrderId>
</Amount>
</Returns>
</Client>
<Client>
<ClientId>2</ClientId>
<!-- Same Tree structure as Client 1 -->
</Client>
</OrdersReport>
根据我得到的答复,我已经更新了问题.
Based on the responses I got, I have updated the question.
var doc = XDocument.Load(rootFolder + "Generic.xml");
var query = doc.Descendants("Order")
.Concat(doc.Descendants("OrderCancelled"))
.Select(x => new
{
OrderNumber = (int)x.Element("OrderNumber"),
ShipAddress = (string)x.Element("ShipAddress"),
ShipCity = (string)x.Element("ShipCity"),
ShipState = (string)x.Element("ShipState")
});
var amount = doc.Descendants("Amount")
.Select(y => new
{
OrderId = (int)y.Element("OrderId")
});
foreach (var o in query)
{
Console.WriteLine(o.OrderNumber + o.ShipAddress + o.ShipCity);
}
foreach (var r in amount)
{
Console.WriteLine(r.OrderId);
}
金额枚举仅给我第一个OrderId,我在做什么错呢?
The amount enumeration is only giving me the first OrderId, what am I doing incorrectly?
推荐答案
听起来您只需要所有后代Order/OrderCancelled元素:
It sounds like you just want all the descendant Order/OrderCancelled elements:
var doc = XDocument.Load("file.xml");
var query = doc.Descendants("Order")
.Concat(doc.Descendants("OrderCancelled"))
.Select(x => new {
OrderNumber = (int) x.Element("OrderNumber"),
ShipAddress = (string) x.Element("ShipAddress"),
ShipCity = (string) x.Element("ShipCity"),
ShipState = (string) x.Element("ShipState")
});
然后,您可以遍历结果(将是匿名类型的序列),并执行将其插入数据库的所有操作.
Then you can iterate over the results, which will be a sequence of the anonymous type, and do whatever you need to insert it into the database.
这篇关于如何使用LINQ to XML解析深度嵌套的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!