确定XML中的元素是否存在于Linq中

时间:2014-02-20 23:42:10

标签: c# xml linq

所以我正在使用亚马逊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,以便稍后使用它。

我尝试过的一些事情:

  • 从responseXMLDoc.Root.Element
  • 中删除了“root”
  • 未在(ns +“NextToken)
  • 中使用命名空间

请求中只有一个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();

1 个答案:

答案 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();