我有一个从REST调用返回的XML,我需要使用xdoc.SelectNodes,但XML有一个命名空间。
<SubscriptionOperationCollection xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<SubscriptionOperations>
<subscriptionOperation>...</SubscriptionOperation>
</SubscriptionOperations>
问题:有没有办法在不指定命名空间的情况下使用selectNodes()?我犹豫不决,以防命名空间在未来发生变化。
// This returns 0, should return 1
xdoc.SelectNodes("/SubscriptionOperationCollection/SubscriptionOperations").Count;
答案 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