Получить значение дочернего узла, используя родительский узел в 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);
}
}
}
Я надеюсь это тебе поможет.