Получить значение дочернего узла, используя родительский узел в XML

Как получить значение узла, используя имя родительского тега.

Вот мой формат 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>

Как получить стоимость товара и стоимость доставки.

Здесь я попробовал до сих пор..

Способ 1:

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

Способ 2:

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.

Какие-либо предложения??

2 ответа

Решение

Это классическая проблема пространства имен по умолчанию. Ваш 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;

Во втором методе вы можете использовать свойство 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);

                    }
                }
            }

Я надеюсь это тебе поможет.

Другие вопросы по тегам