Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果xml文档仅放在一行上,则xpath-node test text()不起作用_Xml_Xpath - Fatal编程技术网

如果xml文档仅放在一行上,则xpath-node test text()不起作用

如果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-

对放在一行上的xml文档使用xpath text()函数时遇到问题。如果在完全相同的xml的漂亮打印版本上使用,text()可以正常工作

在本例中,我使用的是ruby和nokogiri,但我在firefox插件中看到了相同的行为。我使用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
将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