Search code examples
c#xmldefault-namespace

Get Child Node value using parent Node in XML


How to Get the Value of the node by using the parent tag name.

Here is my XML format.

<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>

How to get Item Price Amount and Shipping Price Amount.

Here i tried so far..

Method 1:

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

Method 2:

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

How to Get ItemPrice 30 and ShippingPrice 5.

Any Suggestions??


Solution

  • This is a classical problem of default namespace. Your XML has default namespace declared at the root element :

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

    All elements without prefix are considered in the above mentioned default namespace. To select element in namespace, you need to use 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;