xpath如何处理xml名称空间?
如果我使用
/IntuitResponse/QueryResponse/Bill/Id
要解析下面的xml文档,我得到了0个节点。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3"
time="2016-10-14T10:48:39.109-07:00">
<QueryResponse startPosition="1" maxResults="79" totalCount="79">
<Bill domain="QBO" sparse="false">
<Id>=1</Id>
</Bill>
</QueryResponse>
</IntuitResponse>
但是,我没有在xpath中指定名称空间(即。 http://schema.intuit.com/finance/v3
不是路径的每个标记的前缀)。xpath怎么知道是哪个 Id
如果我不说清楚的话我想知道?我想在这种情况下(因为只有一个名称空间),xpath可以忽略 xmlns
完全是。但是如果有多个名称空间,事情可能会变得很糟糕。
2条答案
按热度按时间vsdwdz231#
在xpath中定义名称空间(推荐)
xpath本身没有将命名空间前缀与命名空间绑定的方法。这些设施由托管图书馆提供。
建议您使用这些工具并定义命名空间前缀,然后根据需要使用这些前缀来限定xml元素和属性名称。
以下是xpath主机为指定命名空间URI的命名空间前缀绑定提供的一些机制:
xslt:
perl(libxml):
python(lxml):
python(元素树):
Python(scrapy):
java(sax):
java(xpath):
记得打电话
DocumentBuilderFactory.setNamespaceAware(true)
.另请参见:javaxpath:带有默认名称空间xmlns的查询
xmlstarlet公司:
javascript代码:
请参见实现用户定义的命名空间解析器:
请注意,如果默认命名空间定义了关联的命名空间前缀,则使用
nsResolver()
退回人Document.createNSResolver()
可以免除对客户的需求nsResolver()
.PHP:
改编自@tomalak使用domdocument的答案:
另请参阅@imsop关于php simplexml名称空间的规范q/a。
c#:
vba:
vb.net版本:
Ruby(nokogiri):
注意nokogiri支持移除名称空间,
但是请看下面的警告,这些警告阻止了xml名称空间的失败。
一旦声明了名称空间前缀,就可以编写xpath来使用它:
在xpath中消除名称空间(不推荐)
另一种方法是编写测试
local-name()
:或者,在xpath 2.0中:
以这种方式绕过名称空间是可行的,但不建议这样做,因为它
指定完整的元素/属性名称。
无法区分不同名称空间中的元素/属性名称(名称空间的真正用途)。请注意,可以通过添加附加 predicate 来显式检查命名空间uri 1来解决此问题:
感谢丹尼尔·海利
namespace-uri()
注意。过于冗长。
nkcskrwz2#
我用
/*[name()='...']
在谷歌的表格中从维基数据中获取一些数据。我有一张这样的table以及cols中的公式
links
以及items
是分别。sparql查询碰巧没有任何空格。。。
我看见了
name()
代替local-name()
在xml命名空间中破坏我的xpath!,出于某种原因//*:literal
不起作用。