【问题标题】:Iterating through an Amazon-specific XDocument遍历 Amazon 特定的 XDocument
【发布时间】:2017-10-04 15:40:10
【问题描述】:

我正在使用亚马逊广告 API,它返回 XML,如以下小提琴所示:http://xopusfiddle.net/27NxH/

我正在寻找亚马逊提供的商品的价值,如果它存在的话。理论上,下面应该返回一个名称为Amount,值为9980的XML节点

string uri = "redacted" + isbn;
string signedUri = helper.Sign(uri);
WebRequest request = HttpWebRequest.Create(signedUri);
WebResponse response = request.GetResponse();
XmlDocument xDoc = new XmlDocument();
xDoc.Load(response.GetResponseStream());
var testvar = xDoc.SelectSingleNode("/ItemLookupResponse/Items/Item/ItemAttributes/ListPrice");

但是,testvar 返回null。当我也尝试返回 XmlNodeList 时也会发生同样的情况。

我检查了确实加载了一个 XML 文档(有),我注意到以下将返回正确的节点 (Amount),其值为 9980

XmlNode aznPriceNode = xDoc.DocumentElement.ChildNodes.Item(1).ChildNodes.Item(1).ChildNodes.Item(8).ChildNodes.Item(10).ChildNodes.Item(0);

但是,硬编码这样的路径是一个糟糕的想法,并且并不总是有效,因为 XML 文档可能并不总是包含 ListPrice 条目。

为什么 XPath 在这种情况下不起作用?

【问题讨论】:

    标签: c# xml amazon-web-services xpath


    【解决方案1】:

    需要添加命名空间。

    const string xpath = "/x:ItemLookupResponse/x:Items/x:Item/x:ItemAttributes/x:ListPrice";
    XmlDocument xDoc = new XmlDocument();
    XmlNamespaceManager ns = new XmlNamespaceManager(new NameTable());
    xDoc.Load(response.GetResponseStream());
    ns.AddNamespace("x", xDoc.DocumentElement.NamespaceURI);
    var testvar = xDoc.SelectSingleNode(xpath, ns);
    

    【讨论】:

    • 为什么命名空间如此必要?例如,我可以编辑内存中的 XmlDocument 以删除命名空间吗?我问这个是因为命名空间中有一个日期,并且显然可能会在任何给定点发生变化,从而使我的应用程序无用。
    • 我已经更新解决方案先加载文档,然后使用xDoc.DocumentElement.NamespaceURI直接从文档中获取命名空间Url。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2021-08-28
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多