我有一系列来自亚马逊显示订单报告的复杂XML文件。亚马逊市场XML与LINQ解析
一个XML片断是如下:
<Order>
<AmazonOrderID>000-1111111-2222222</AmazonOrderID>
<MerchantOrderID>111-3333333-4444444</MerchantOrderID>
<PurchaseDate>2012-03-02T13:28:53+00:00</PurchaseDate>
<LastUpdatedDate>2012-03-02T13:29:05+00:00</LastUpdatedDate>
<OrderStatus>Pending</OrderStatus>
<SalesChannel>Amazon.com</SalesChannel>
<URL>http://www.amazon.com</URL>
<FulfillmentData>
<FulfillmentChannel>Amazon</FulfillmentChannel>
<ShipServiceLevel>Standard</ShipServiceLevel>
<Address>
<City>Beverly Hills</City>
<State>CA</State>
<PostalCode>90210-1234</PostalCode>
<Country>US</Country>
</Address>
</FulfillmentData>
<OrderItem>
<ASIN>AmazonASIN </ASIN>
<SKU> Internal-SKU</SKU>
<ItemStatus>Pending</ItemStatus>
<ProductName> This is the name of the product </ProductName>
<Quantity>1</Quantity>
<ItemPrice>
<Component>
<Type>Principal</Type>
<Amount currency="USD">19.99</Amount>
</Component>
</ItemPrice>
</OrderItem>
</Order>
我需要这个文件做的是提取XML文档的各个部分,然后做一些事情与数据。
我遇到的问题有多个订购商品。
以下代码将正确抓取每个节点并将其放入列表项中,但我不确定如何将这些多个项目与C#中的相同订单号关联起来。
C#片段:
List<string> getNodes(string path, string nodeName) {
List<string> nodes = new List<string>();
XDocument xmlDoc = XDocument.Load(path); //Create the XML document type
foreach (var el in xmlDoc.Descendants(nodeName)) {
//for debugging
//nodes.Add(el.Name + " " + el.Value);
//for production
nodes.Add(el.Value);
}
return nodes;
} //end getNodes
的方法被称为像:
List<string> skuNodes = xml.getNodes(@"AmazonSalesOrders.xml", "SKU");
其中XML是实例化的类。
为了进一步解释复杂性:如果将每个节点放入自己的列表中,则列表的长度将保持不变,只提供一个项目。一旦订购了多件商品,SKU,数量,价格等清单将变得更长,并防止轻松循环。
我确信有一个LINQ to XML语句可以完成我所需要的工作,但我没有足够的经验可以用C#来破解它。
+++++++++++++++编辑+++++++++++++++++++
我想一些LINQ建议我在网上找到了。下面看起来很有希望,但返回的例外:
base {System.SystemException} = {"Object reference not set to an instance of an object."}
代码:
var query = from xEle in xmlDoc.Descendants(node)
where xEle.Element("AmazonOrderID").Value.ToString() == primaryKey
select new {
tag = xEle.Name.LocalName,
value = xEle.Value
};
我不清楚这是为什么发生的,节点的变量,和主键在运行时通过。
如果我设置断点,我可以看到primaryKey正在正确传递,与节点相同;但是当我到达时:
Dictionary<string, string> ordersByID = new Dictionary<string, string>();
foreach (var CurNode in query) {
ordersByID.Add(CurNode.tag, CurNode.value);
}
我得到空引用错误,因为它分析CurNode。
请告诉我们您正在使用的是什么amazon服务,以及您打算获取此XML的URL是什么? – Diego 2012-03-02 15:14:24
URL和Web服务与问题无关,因为问题不在于获取XML文件本身,它将其解析为将多个订单项与相同的订单ID相关联。 – 2012-03-02 15:20:03
'skuNodes.GroupBy(n => n.AmazonOrderID)'? – 2012-03-02 15:26:42