可以在没有命名空间的情况下使用SelectNodes吗?

时间:2013-09-02 06:39:53

标签: c# xml linq-to-xml

我有一个从REST调用返回的XML,我需要使用xdoc.SelectNodes,但XML有一个命名空间。

示例XML

<SubscriptionOperationCollection xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <SubscriptionOperations>
        <subscriptionOperation>...</SubscriptionOperation>
    </SubscriptionOperations>

问题:有没有办法在不指定命名空间的情况下使用selectNodes()?我犹豫不决,以防命名空间在未来发生变化。

C#

// This returns 0, should return 1
xdoc.SelectNodes("/SubscriptionOperationCollection/SubscriptionOperations").Count;

3 个答案:

答案 0 :(得分:1)

在Linq的帮助下

var subscriptionOperations = xdoc.Descendants()
                            .Where(d=>d.Name.LocalName =="SubscriptionOperation");

答案 1 :(得分:1)

  

我的犹豫是以防命名空间在未来发生变化。

如果命名空间发生变化,则表示“合同”已更改。您不能假设您的代码可以理解这样的XML,除非您也了解新的命名空间。

我想说在你的代码中使用命名空间,并确保你的代码有明确的失败路径,如果SelectNodes没有返回结果。

答案 2 :(得分:0)

XmlDocument xdoc = new XmlDocument();
xdoc.Load("file path");
XElement xElement = XElement.Parse(xdoc.OuterXml);
XNamespace xNamespace = xElement.GetDefaultNamespace();
xdoc.LoadXml(xElement.ToString().Replace("xmlns=\"" + xNamespace.ToString() + "\"", ""));     
int nodeCount = xdoc.SelectNodes("/SubscriptionOperationCollection/SubscriptionOperations").Count;

删除命名空间后,我现在将“ nodeCount ”设为1