I have this XML that I want to be able to pull out the Order#, Item(s), Qty, ItemPrice (Principal, Tax, could be others as well). Here is the XML (see below). What I am having problems with is wiht the ItemPrice. With in it you can 0 to Many Price Components, Tax, Principal Etc. How can I pull those out into a single line output?
我有这个XML,我希望能够提取Order#,Item(s),Qty,ItemPrice(Principal,Tax,也可以是其他人)。这是XML(见下文)。我遇到的问题是与ItemPrice有关。在其中你可以0到多个价格组件,税,主要等。我怎样才能将它们拉出到单行输出中?
Right Now I can get orderNumber, ItemNumber, Qty...but when i pull the Price I get a line for tax and prinicpal.
现在我可以获得orderNumber,ItemNumber,Qty ......但是当我拉价格时,我得到一条税和原则线。
One other question is what happens if in some instances Tax isn't there? I will get a null reference won't I? I want to try and handle those and just substitute 0. Any suggestions are greatly appreicated.
另一个问题是如果在某些情况下税收不存在会发生什么?我会得到一个空引用不是吗?我想尝试处理这些并且只是替换0.任何建议都非常有用。
XML:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<SettlementReport>
<Order>
<AmazonOrderID>105-6982537-6258888</AmazonOrderID>
<ShipmentID>MyShipmentIDTest1234</ShipmentID>
<MarketplaceName>Amazon.com</MarketplaceName>
<Fulfillment>
<MerchantFulfillmentID>MyTestFulFillID12345</MerchantFulfillmentID>
<PostedDate>2008-12-15T19:33:04+00:00</PostedDate>
<Item>
<AmazonOrderItemCode>13350774331938</AmazonOrderItemCode>
<SKU>U1409</SKU>
<Quantity>1</Quantity>
<ItemPrice>
<Component>
<Type>Principal</Type>
<Amount currency="USD">0.15</Amount>
</Component>
<Component>
<Type>Tax</Type>
<Amount currency="USD">0.02</Amount>
</Component>
</ItemPrice>
</Item>
<Item>
<AmazonOrderItemCode>13350774331939</AmazonOrderItemCode>
<SKU>U14010</SKU>
<Quantity>2</Quantity>
<ItemPrice>
<Component>
<Type>Principal</Type>
<Amount currency="USD">0.30</Amount>
</Component>
<Component>
<Type>Tax</Type>
<Amount currency="USD">0.04</Amount>
</Component>
</ItemPrice>
</Item>
</Fulfillment>
</Order>
</SettlementReport>
My Code:
我的代码:
XDocument customer = XDocument.Load(@"C:\LinqToXML.xml");
var orders = from amznorders in customer.Root.Elements("Order")
from amznfulfill in amznorders.Elements("Fulfillment")
from amznitems in amznfulfill.Elements("Item")
from amznitemprc in amznitems.Elements("ItemPrice").Elements("Component")
select new
{
OrderNumber = (string)amznorders.Element("AmazonOrderID"),
ItemNumber = (string)amznitems.Element("AmazonOrderItemCode"),
QTY = (string)amznitems.Element("Quantity"),
//This is where I need help...if type = Principal set PriceAmount else Set PriceTax?//
PriceAmount = (string)amznitemprc.Element("Amount")
//Address1 = (string)address1.Element("Address1")
};
foreach (var order in orders)
{
Console.WriteLine("Order: {0} ItemNumber: {1} QTY: {2} PriceAmount: {3} ", order.OrderNumber, order.ItemNumber, order.QTY, order.PriceAmount);
}
1 个解决方案
#1
0
Doable, though admittedly a bit awkward. I'd probably use a pair of let variables hold the sub-components I want (assuming you only want those two specific values).
虽然可行,但确实有点尴尬。我可能会使用一对let变量来保存我想要的子组件(假设你只需要那两个特定的值)。
Edited to remove the lets due to problem with the Where clause. I don't think there's a problem with the Where in the select, but it may have the same problem.
由于Where子句的问题而编辑删除了let。我不认为选择中的Where有问题,但它可能有同样的问题。
var orders = from amznorders in customer.Root.Elements("Order")
from amznfulfill in amznorders.Elements("Fulfillment")
from amznitems in amznfulfill.Elements("Item")
from amznitemprc in amznitems.Elements("ItemPrice").Elements("Component")
select new
{
OrderNumber = (string)amznorders.Element("AmazonOrderID"),
ItemNumber = (string)amznitems.Element("AmazonOrderItemCode"),
Qty = (string)amznitems.Element("Quantity"),
PriceAmount = amznitemprc.Where(xe => xe.Element("Type").Value == "Principal").FirstOrDefault().Value,
TaxAmount = amxnitemprc.Where(xe => xe.Element("Type").Value == "Tax").FirstOrDefault() == null ? string.Empty : amxnitemprc.Where(xe => xe.Element("Type").Value == "Tax").FirstOrDefault(),
TotalItemPrice = amznitemprc.Sum(xe => decimal.Parse(xe.Element("Amount").Value)).ToString(),
//Address1 = (string)address1.Element("Address1")
};
#1
0
Doable, though admittedly a bit awkward. I'd probably use a pair of let variables hold the sub-components I want (assuming you only want those two specific values).
虽然可行,但确实有点尴尬。我可能会使用一对let变量来保存我想要的子组件(假设你只需要那两个特定的值)。
Edited to remove the lets due to problem with the Where clause. I don't think there's a problem with the Where in the select, but it may have the same problem.
由于Where子句的问题而编辑删除了let。我不认为选择中的Where有问题,但它可能有同样的问题。
var orders = from amznorders in customer.Root.Elements("Order")
from amznfulfill in amznorders.Elements("Fulfillment")
from amznitems in amznfulfill.Elements("Item")
from amznitemprc in amznitems.Elements("ItemPrice").Elements("Component")
select new
{
OrderNumber = (string)amznorders.Element("AmazonOrderID"),
ItemNumber = (string)amznitems.Element("AmazonOrderItemCode"),
Qty = (string)amznitems.Element("Quantity"),
PriceAmount = amznitemprc.Where(xe => xe.Element("Type").Value == "Principal").FirstOrDefault().Value,
TaxAmount = amxnitemprc.Where(xe => xe.Element("Type").Value == "Tax").FirstOrDefault() == null ? string.Empty : amxnitemprc.Where(xe => xe.Element("Type").Value == "Tax").FirstOrDefault(),
TotalItemPrice = amznitemprc.Sum(xe => decimal.Parse(xe.Element("Amount").Value)).ToString(),
//Address1 = (string)address1.Element("Address1")
};