I’m trying to get my head arround “Linq to xml” so let me jump right to it. I have this xml :
<?xml version="1.0"?>
<PurchaseOrders>
<PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
<Address Type="Shipping">
<Name>Ellen Adams</Name>
<Street>123 Maple Street</Street>
<City>Mill Valley</City>
<State>CA</State>
<Zip>10999</Zip>
<Country>USA</Country>
</Address>
<Address Type="Billing">
<Name>Tai Yee</Name>
<Street>8 Oak Avenue</Street>
<City>Old Town</City>
<State>PA</State>
<Zip>95819</Zip>
<Country>USA</Country>
</Address>
<DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes>
<Items>
<Item PartNumber="872-AA">
<ProductName>Lawnmower</ProductName>
<Quantity>1</Quantity>
<USPrice>148.95</USPrice>
<Comment>Confirm this is electric</Comment>
</Item>
<Item PartNumber="926-AA">
<ProductName>Baby Monitor</ProductName>
<Quantity>2</Quantity>
<USPrice>39.98</USPrice>
<ShipDate>1999-05-21</ShipDate>
</Item>
</Items>
</PurchaseOrder>
</PurchaseOrders>
And then I created som simple objects :
public class PurchaseOrder
{
public string PurchaseOrderNumber { get; set; }
public string OrderDate { get; set; }
public Address BillingAddress { get; set; }
public Address ShippingAddress { get; set; }
public string DeliveryNotes { get; set; }
public List<Item> Items { get; set; }
}
public class Address
{
public string Type { get; set; }
public string Name { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
public string Country { get; set; }
}
public class Item
{
public string PartNumber { get; set; }
public string ProductName { get; set; }
public string Quantity { get; set; }
public string USPrice { get; set; }
public string Comment { get; set; }
}
Then i go ahead an make my linq :
var orders = (from order in XDocument.Load(Server.MapPath("/App_Data/Order.xml")).Descendants("PurchaseOrder")
select new PurchaseOrder
{
PurchaseOrderNumber = order.Attribute("PurchaseOrderNumber").Value,
OrderDate = order.Attribute("OrderDate").Value,
BillingAddress = new Address
{
City = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Billing").Single().Element("City").Value,
Country = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Billing").Single().Element("Country").Value,
Name = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Billing").Single().Element("Name").Value,
State = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Billing").Single().Element("State").Value,
Street = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Billing").Single().Element("Street").Value,
Type = "Billing",
Zip = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Billing").Single().Element("Zip").Value
},
ShippingAddress = new Address
{
City = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Shipping").Single().Element("City").Value,
Country = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Shipping").Single().Element("Country").Value,
Name = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Shipping").Single().Element("Name").Value,
State = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Shipping").Single().Element("State").Value,
Street = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Shipping").Single().Element("Street").Value,
Type = "Shipping",
Zip = order.Descendants("Address").Where(a => a.Attribute("Type").Value == "Shipping").Single().Element("Zip").Value
},
DeliveryNotes = order.Element("DeliveryNotes").Value,
Items = null
});
First of, why does the “order.Element(“DeliveryNotes”).Value” not exists in the output xml and throws “Object reference not set to an instance of an object” ?
Second, how do I get the “Type” (which is an Attribute) for the address?
Third, how do I make the list of items this one “Items = null” so that I have a fully functional object to work with ?
And finally if the rest of the linq needs som tuning then go ahead and guid me in the right direction ;o)
UPDATE
I’ve rewrited code so it do not using
valueproperty now. It also should populate yourItemslist.I’ve found this topics very useful:
LINQ to XML optional element query
How do you guard for Null Reference exceptions in Linq To Xml?