使用LINQ进行Amazon Marketplace XML解析

我有一系列来自亚马逊的复杂XML文件,显示订单报告。

XML片段如下:

 000-1111111-2222222 111-3333333-4444444 2012-03-02T13:28:53+00:00 2012-03-02T13:29:05+00:00 Pending Amazon.com http://www.amazon.com  Amazon Standard 
Beverly Hills CA 90210-1234 US
AmazonASIN Internal-SKU Pending This is the name of the product 1 Principal 19.99

我需要对此文件执行的操作是提取XML文档的各个部分,然后对数据执行许多操作。

我遇到的问题是多个订单商品。

以下代码将正确获取每个节点并将其放入列表项中,但我不确定如何将这些多个项与C#中的相同订单号相关联。

C#片段:

 List getNodes(string path, string nodeName) { List nodes = new List(); 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 skuNodes = xml.getNodes(@"AmazonSalesOrders.xml", "SKU"); 

其中xml是实例化的类。

为了进一步解释复杂性:如果将每个节点放入其自己的列表中,则只需订购一个项目,列表的长度将保持不变。 一旦订购了多个商品,SKU,数量,价格等列表将变得更长,并防止轻松循环。

我确信有一个LINQ to XML语句可以完成我需要的工作,但是我没有足够的经验来使用C#来破解它。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我正在尝试在网络上找到的一些LINQ建议。 以下看起来很有希望但是返回exception:

 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 ordersByID = new Dictionary(); foreach (var CurNode in query) { ordersByID.Add(CurNode.tag, CurNode.value); } 

我解析CurNode时得到空引用错误。

你可以按照你的想法使用linq实现这一点,像这样的东西应该工作,如果itemprice等需要添加更多的元素.. :(其中ns是命名空间)

 xmlDoc = XDocument.Parse(sr.ReadToEnd()); XNamespace ns = "w3.org/2001/XMLSchema-instance"; var query = from order in xmlDoc.Descendants(ns + "Order") from orderItem in order.Elements(ns + "OrderItem") select new { amazonOrdeID = order.Element(ns + "AmazonOrderID").Value, merchantOrderID = order.Element(ns + "MerchantOrderID ").Value, orderStatus = order.Element(ns + "OrderStatus ").Value, asin = orderItem.Element(ns + "ASIN").Value, quantity = orderItem.Element(ns + "quantity").Value }; 

使用上述内容,您可以在单行中将每个亚马逊订单所需的所有信息带回来……

我们已经决定使用另一种方法,所以我没有机会完全测试解决方案,由于方向的改变,我标记为完整。