所以我正在使用亚马逊MWS,我终于能够解析ListOrder响应,但我遇到了问题。如果有超过100个订单,它将在第3级放置一个“NextToken”元素。我一直在努力找到它,但每当我运行我的代码时,即使我知道它存在,它也显示为null(通过查看响应中生成的实际XML)。为了清理,这里是一个XML示例(不相关的元素编辑)和我用来读它的代码。
<ListOrdersResponse xmlns="https://mws.amazonservices.com/Orders/2011-01-01">
<ListOrdersResult>
<NextToken>let's just pretend this is a nice token :)</NextToken>
</ListOrdersResult>
</ListOrdersResponse>
代码:
XElement nextToken = null;
XDocument responseXMLDoc = XDocument.Parse(responseXml);
XNamespace ns = "http://mws.amazonservices.com/schema/Products/2011-10-01";
nextToken = responseXMLDoc.Root.Element(ns + "NextToken");
if (nextToken != null)
{
hasNext = true;
}
else
{
Console.WriteLine("No more pages!");
System.Threading.Thread.Sleep(20000);
}
每次我运行它,即使总是在那里,我收到一个空值。我实际上必须在父作用域中定义XElement,以便稍后使用它。
我尝试过的一些事情:
请求中只有一个NextToken元素,我只需要它的令牌,这样我就可以使用令牌再次调用请求 - 并继续重复,直到没有“NextToken”。
更新:我确定我的语法错误,我似乎无法解决问题。使用相同的示例,尝试
XElement listOrdersResult = responseXMLDoc.Root.Element(ns + "ListOrdersResult");
也会返回一个空值!我在这里阅读了一些关于Linq / XML主题的问题,这就是我学习大部分语法的地方。仍然没有得到任何结果。
更新2:感谢Brad Cunningham的回答!
要修复名称空间问题,我更改了以下内容[根节点始终具有xmlns属性(并且只有该属性):
String docNameSpace = responseXMLDoc.Root.FirstAttribute.Value.ToString();
XNamespace ns = docNameSpace;
更改以下内容为我提供了我正在寻找的元素:
nextToken = responseXMLDoc.Root.Descendants(ns + "NextToken").FirstOrDefault();
答案 0 :(得分:1)
您的命名空间在您的示例中不正确(可能仅为示例复制和粘贴错误)
NextToken的命名空间为
https://mws.amazonservices.com/Orders/2011-01-01
但是,您正在寻找
的命名空间 http://mws.amazonservices.com/schema/Products/2011-10-01
如果元素是父元素的直接子元素,那么使用Element也只返回元素。
如果你不知道节点的级别,你应该使用后代
这对我有用
XDocument responseXMLDoc = XDocument.Parse(responseXml);
XNamespace ns = "https://mws.amazonservices.com/Orders/2011-01-01";
XElement nextToken = responseXMLDoc.Root.Descendants(ns + "NextToken").FirstOrDefault();