c# – 使用LINQ解析亚马逊商城XML
发布时间:2020-12-15 17:24:14 所属栏目:百科 来源:网络整理
导读:我有一系列来自亚马逊的复杂 XML文件,显示订单报告. XML片段如下: Order AmazonOrderID000-2222211-2222222/AmazonOrderID MerchantOrderID111-3333333-4444444/MerchantOrderID PurchaseDate2012-03-02T13:28:53+00:00/PurchaseDate LastUpdatedDate2012-0
我有一系列来自亚马逊的复杂
XML文件,显示订单报告.
XML片段如下: <Order> <AmazonOrderID>000-2222211-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时得到空引用错误. 解决方法
您可以通过使用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 }; 使用上述内容,您可以在单行中将每个亚马逊订单所需的所有信息带回… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |