如何使用XPath忽略名称空间

kos*_*tja 96 xml xpath namespaces xml-namespaces

我的目标是使用XPath从具有多个名称空间的多个xml文件中提取某些节点.只要我知道名称空间URI,一切正常.命名空间名称本身保持不变,但模式(XSD)有时是客户端生成的,即我不知道.然后我基本上有三种选择:

  1. 只使用一个模式用于命名空间,希望没有出错(我能确定吗?)

  2. 获取文档的子节点并查找带有命名空间URI的第一个节点,希望它在那里并只使用URI,希望它是正确的.可能由于多种原因而出错

  3. 不知何故告诉xpath:"看,我不关心命名空间,只需找到具有此名称的所有节点,我甚至可以告诉您命名空间的名称,而不是URI".这就是问题......

这不是许多"我的xpath表达不起作用的重复,因为我不知道命名空间感知" 这里这里发现的问题.我知道如何使用命名空间感知.只是没有如何摆脱它.

Dir*_*mar 146

您可以使用local-name()XPath函数.而不是选择像这样的节点

/path/to/x:somenode
Run Code Online (Sandbox Code Playgroud)

您可以选择所有节点并筛选具有正确本地名称的节点:

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

  • 您也可以使用`local-name()`来引用属性,不以命名空间方式查看:http://stackoverflow.com/q/21239181/274677 (7认同)

And*_*rez 16

您可以使用更简洁的语法在XPath2.0中执行相同的操作:

/path/to/*:somenode
Run Code Online (Sandbox Code Playgroud)

  • 不过,这不适用于默认名称空间中的元素。 (6认同)

js2*_*010 11

或者你可以使用 name():

/path/to/*[name() = 'somenode']
Run Code Online (Sandbox Code Playgroud)

或者只搜索属性:

//*[@attribute="this one"]
Run Code Online (Sandbox Code Playgroud)

如果将 xml 作为 powershell 对象打开,它将忽略命名空间:

[xml]$xml = get-content file.xml
$xml.path.to.somenode
Run Code Online (Sandbox Code Playgroud)