-1

我有一个从 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;
4

3 回答 3

1

在 Linq 的帮助下

var subscriptionOperations = xdoc.Descendants()
                            .Where(d=>d.Name.LocalName =="SubscriptionOperation");
于 2013-09-02T06:43:37.510 回答
1

我的犹豫是将来命名空间发生变化。

如果命名空间发生变化,那么这意味着“合同”已经改变。除非您也了解新的命名空间,否则您不能假设您的代码可以理解此类 XML。

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

于 2013-09-02T06:56:35.160 回答
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

于 2013-09-02T13:29:20.927 回答