XPATHS和默认命名空间

t3r*_*rse 16 c# xml xpath namespaces

XPath背后的故事是什么以及对名称空间的支持?XPath作为规范在命名空间之前吗?如果我有一个文档,其中元素已被赋予默认命名空间:

<foo xmlns="uri" />
Run Code Online (Sandbox Code Playgroud)

似乎某些XPath处理器库//foo由于名称空间而无法识别,而其他库将会识别.我的团队所考虑的选项是使用正则表达式向XPath添加名称空间前缀(可以通过XmlNameTable添加名称空间前缀),但这似乎很脆弱,因为在节点测试时XPath是一种非常灵活的语言.

是否有适用于此的标准?

我的方法有点hackish但似乎工作正常; 我xmlns用搜索/替换删除声明,然后应用XPath.

string readyForXpath = Regex.Replace(xmldocument, "xmlns=\".+\"", String.Empty );
Run Code Online (Sandbox Code Playgroud)

这是一种公平的方法还是有人以不同方式解决了这个问

Stu*_*Stu 15

你需要local-name():

http://www.w3.org/TR/xpath#function-local-name

来自http://jcooney.net/archive/2005/08/09/6517.aspx的婴儿床:

<foo xmlns='urn:foo'>
  <bar>
    <asdf/>
  </bar>            
</foo>
Run Code Online (Sandbox Code Playgroud)

此表达式将匹配"bar"元素:

  //*[local-name()='bar'] 
Run Code Online (Sandbox Code Playgroud)

这个不会:

 //bar
Run Code Online (Sandbox Code Playgroud)


And*_*ven 10

我尝试了类似于古代建议的东西,无法让它发挥作用.由于我从已发布的服务获取数据,因此无法更改xml.我最终使用XmlDocument和XmlNamespaceManager,如下所示:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlWithBogusNamespace);            
XmlNamespaceManager nSpace = new XmlNamespaceManager(doc.NameTable);
nSpace.AddNamespace("myNs", "http://theirUri");

XmlNodeList nodes = doc.SelectNodes("//myNs:NodesIWant",nSpace);
//etc
Run Code Online (Sandbox Code Playgroud)