如果xml文档仅放在一行上,则xpath-node test text()不起作用
对放在一行上的xml文档使用xpath text()函数时遇到问题。如果在完全相同的xml的漂亮打印版本上使用,text()可以正常工作 在本例中,我使用的是ruby和nokogiri,但我在firefox插件中看到了相同的行为。我使用nokogiri和XPath Checker得到了完全相同的结果 顺便说一下: 工作:如果xml文档仅放在一行上,则xpath-node test text()不起作用,xml,xpath,Xml,Xpath,对放在一行上的xml文档使用xpath text()函数时遇到问题。如果在完全相同的xml的漂亮打印版本上使用,text()可以正常工作 在本例中,我使用的是ruby和nokogiri,但我在firefox插件中看到了相同的行为。我使用nokogiri和XPath Checker得到了完全相同的结果 顺便说一下: 工作: doc = Nokogiri::XML::Document.parse <<-EOXML <?xml version="1.0" encoding="UTF-
doc = Nokogiri::XML::Document.parse <<-EOXML
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getOSVersionResponse xmlns:ns="http://www.cisco.com/AXL/API/8.5">
<return>
<os>
<osName>Linux</osName>
<osVersion>2.6.18-194.26.1.el5PAE</osVersion>
<aarNeighborhoodName/>
</os>
</return>
</ns:getOSVersionResponse>
</soapenv:Body>
</soapenv:Envelope>
EOXML
将xml放在一行中,我已经
> doc.xpath("//*[not(text())]").length
=> 6
这是错误的,因为我没有六个空的xml节点
如何使xpath与一行xml文档一起工作
谢谢/*[not(text())]
将为您提供所有没有文本节点的直接子元素的元素。当XML全部位于一行时,除了osName
和osVersion
之外的所有元素都是如此,因为它们没有任何子文本节点,只有子元素。当XML打印得很好时,大多数元素都有完全由空白组成的文本节点子元素,这就是为什么在这种情况下它看起来“有效”的原因
如果要测试完全为空且没有子节点(文本节点、元素、注释等)的元素,请使用
/*[非(节点())]
请注意,属性节点在XPath数据模型中不被视为“子节点”,因此这仍然会拾取类似
的内容。如果您想排除这些,那么您需要
/*[不是(@*| node())]
> doc.xpath("//*[not(text())]")
=> [#<Nokogiri::XML::Element:0x1862238 name="aarNeighborhoodName">]
> doc.xpath("//*[not(text())]").length
=> 1
> doc.xpath("//*[not(text())]").length
=> 6