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);
}
The amount enumeration is only giving me the first OrderId, what am I doing incorrectly?
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.
I think it is possible without concatenation:
var query = from o in xdoc.Descendants("Orders").Elements()
select new
{
OrderNumber = (int)o.Element("OrderNumber"),
ShipAddress = (string)o.Element("ShipAddress"),
ShipCity = (string)o.Element("ShipCity"),
ShipState = (string)o.Element("ShipState")
};
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.