如何在大型XDocument中获取节点的值

时间:2012-08-14 10:45:40

标签: c# xml linq linq-to-xml

与Google Checkout合作很多,而且回复总是大量的XML数据。我想要的是从这个废墟中解析出名为商家私有数据的节点。

它可能并不总是存在,它可能位于多个位置(具有相同的值)。

我尝试了一种简单的方法,但没有产生任何结果。

来自沙盒响应:

<?xml version="1.0" encoding="UTF-8"?>
<authorization-amount-notification xmlns="http://checkout.google.com/schema/2" serial-number="123456789">
    <authorization-amount currency="USD">11.65</authorization-amount>
    <authorization-expiration-date>2012-08-21T12:30:16.000Z</authorization-expiration-date>
    <avs-response>Y</avs-response>
    <cvn-response>U</cvn-response>
    ...
    <order-summary>
        ...
        <shopping-cart>
        ...
            <merchant-private-data>
                <MERCHANT_DATA_HIDDEN>50c77071-aeea-40fe-962b-f4d51d1f9b0</MERCHANT_DATA_HIDDEN>
            </merchant-private-data>
        ...
        </shopping-cart>
        ...
    </order-summary>
</authorization-amount-notification>

可能在更多地方,可能并不总是在那个位置。

我的想法是这样,但它没有用(即使我可以看到xml中的节点,也会得到0结果):

XDocument input = XDocument.Parse(xmldata);
string privateData = null;
var privateDataNode = (from nodes in input.Descendants("merchant-private-data") select nodes).FirstOrDefault();
if (privateDataNode != null && privateDataNode.HasElements && privateDataNode.Element("MERCHANT_DATA_HIDDEN") != null)
       privateData = privateDataNode.Element("MERCHANT_DATA_HIDDEN").Value;

1 个答案:

答案 0 :(得分:2)

你缺少命名空间,试试这样:

        XDocument input = XDocument.Parse(xmldata);
        XNamespace ns = input.Root.Name.Namespace;

        string privateData = null;
        var privateDataNode = (from nodes in input.Descendants(ns + "merchant-private-data") select nodes).FirstOrDefault();
        if (privateDataNode != null && privateDataNode.HasElements && privateDataNode.Element(ns + "MERCHANT_DATA_HIDDEN") != null)
            privateData = privateDataNode.Element(ns + "MERCHANT_DATA_HIDDEN").Value;