【问题标题】:Get Child Node value using parent Node in XML使用 XML 中的父节点获取子节点值
【发布时间】:2016-05-05 11:18:01
【问题描述】:

如何通过父标签名获取节点的Value。

这是我的 XML 格式。

<ListOrderItemsResponse xmlns="https://mws.amazonservices.com/Orders/2013-09-01">
 <ListOrderItemsResult>
   <AmazonOrderId>Order Id</AmazonOrderId>
 <OrderItems>
   <OrderItem>
     <ASIN>Asin Value</ASIN>
     <SellerSKU>SKU</SellerSKU>
     <OrderItemId>SKU Value</OrderItemId>
     <Title>Product Title</Title>
     <QuantityOrdered>1</QuantityOrdered>
     <QuantityShipped>0</QuantityShipped>
     <ItemPrice>
         <CurrencyCode>INR</CurrencyCode>
         <Amount>30.00</Amount>
     </ItemPrice>
     <ShippingPrice>
        <CurrencyCode>INR</CurrencyCode>
        <Amount>5.00</Amount>
     </ShippingPrice>
  </OrderItem>
</OrderItems>
</ListOrderItemsResult>

如何获取商品价格金额和运费金额。

到目前为止,我在这里尝试过..

方法一:

XmlNode node12 = xd1.SelectSingleNode("/ListOrderItemsResponse[@*]/ListOrderItemsResult/OrderItems/OrderItem/ItemPrice");
string id = node12["Amount"].InnerText;

方法二:

int i = 0;
                XmlNodeList nodeAMT = xd1.GetElementsByTagName("Amount");
                string[] AMT = new string[TotalCount];
                foreach (XmlElement node in nodeAMT)
                {
                    AMT[i] = node.InnerText;
                    i++;
                }

如何获取 ItemPrice 30 和 ShippingPrice 5。

有什么建议吗??

【问题讨论】:

标签: c# xml default-namespace


【解决方案1】:

这是默认命名空间的经典问题。您的 XML 在根元素中声明了默认命名空间:

xmlns="https://mws.amazonservices.com/Orders/2013-09-01"

所有没有前缀的元素都被考虑在上面提到的默认命名空间中。要选择命名空间中的元素,您需要使用XmlNamespaceManager

var nsmgr = new XmlNamespaceManager(new NameTable());
//register mapping of prefix to namespace uri 
nsmgr.AddNamespace("d", "https://mws.amazonservices.com/Orders/2013-09-01");

string query = "/d:ListOrderItemsResponse/d:ListOrderItemsResult/d:OrderItems/d:OrderItem/d:ItemPrice/d:Amount";
XmlNode node = xd1.SelectSingleNode(query, nsmgr);
string itemPrice = node.InnerText;

【讨论】:

  • 我收到错误:需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。在 XmlNode 节点 = xd1.SelectSingleNode(query) 行
  • 哎呀.. 忘记将命名空间管理器传递给SelectSingleNode()
  • 字符串 itemPrice = node.InnerText 中的对象引用错误。
  • 从 XPath 中删除属性谓词 [@*]。根元素没有属性,只有命名空间声明。我确定现在应该可以使用了,请参阅演示:dotnetfiddle.net/0W0tRn
【解决方案2】:

使用第二种方法,您可以使用 XmlElement Parent 属性来获取父级的名称。

 XmlNodeList amounts = xml.GetElementsByTagName("Amount");
            foreach (XmlElement amount in amounts)
            {
                if (amount.ParentNode != null)
                {
                    if (amount.ParentNode.Name.Equals("ItemPrice"))
                    {
                        Console.WriteLine("Item Price"+amount.InnerText);
                    }
                    if (amount.ParentNode.Name.Equals("ShippingPrice"))
                    {
                        Console.WriteLine("Shipping Price" + amount.InnerText);

                    }
                }
            }

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    相关资源
    最近更新 更多