gpt4 book ai didi

xml - xpath - 如果仅将 xml 文档放在一行上,则节点测试文本()不起作用

转载 作者:行者123 更新时间:2023-12-03 16:37:13 25 4
gpt4 key购买 nike

我在放置在单行上的 xml 文档上使用 xpath text() 函数时遇到了麻烦。如果在完全相同的 xml 的 pretty-print 版本上使用, text() 可以正常工作。

在这种情况下,我使用的是 ruby​​ 和 nokogiri,但我在 firefox 插件 XPath Checker 上看到了相同的行为。 .我使用 nokogiri 和 XPath Checker 得到了完全相同的结果。

顺便一提:

在职的:

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

不工作:
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

Xpath 查询:
doc.xpath("//*[not(text())]")
我的最终目标是找到并删除空的 xml 节点(在本例中为 <aarNeighborhoodName/>)。

使用 pretty-print 的 xml,我找到了一个空标签(这是正确的):
> doc.xpath("//*[not(text())]")
=> [#<Nokogiri::XML::Element:0x1862238 name="aarNeighborhoodName">]
> doc.xpath("//*[not(text())]").length
=> 1

将xml放在一行上,我有
> doc.xpath("//*[not(text())]").length
=> 6

这是错误的,因为我没有六个空的 xml 节点。

如何使 xpath 与单行 xml 文档一起使用?

谢谢你

最佳答案

//*[not(text())]将为您提供所有没有作为文本节点的直接子级的元素。当您的 XML 全部在一行上时,除了 osName 之外的所有元素都是如此。和 osVersion因为它们没有任何子文本节点,只有子元素。当 XML 打印得很漂亮时,您的大多数元素都具有完全由空格组成的文本节点子节点,这就是为什么在这种情况下它似乎“工作”的原因。

如果要测试完全为空且根本没有子节点的元素(文本节点、元素、评论等),请使用

//*[not(node())]

请注意,属性节点在 XPath 数据模型中不被视为“子节点”,因此仍会选择 <emptyElement with="attribute" /> 之类的内容。 .如果您也想排除这些,那么您需要

//*[not(@*|node())]

关于xml - xpath - 如果仅将 xml 文档放在一行上,则节点测试文本()不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20218228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com