使用LINQ进行Amazon Marketplace XML解析

本文关键字:XML 解析 Marketplace Amazon LINQ 进行 使用 | 更新日期: 2023-09-27 18:26:22

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

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被正确地传递,和node一样;然而,当我到达:

Dictionary<string, string> ordersByID = new Dictionary<string, string>();
        foreach (var CurNode in query) {
            ordersByID.Add(CurNode.tag, CurNode.value);
        }

当它解析CurNode时,我得到了null引用错误。

使用LINQ进行Amazon Marketplace XML解析

您可以按照自己的想法使用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
            };

使用以上功能,您将能够在一行中带回每个亚马逊订单所需的所有信息。。。

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