XPath:如果元素不存在,是否可以返回空字符串

时间:2012-03-28 23:55:59

标签: ruby-on-rails ruby xml xpath nokogiri

我使用nokogiri(反过来使用xpath)来解析xml文件。 xml有一些数据,包括每个元素的“定义”。一些子节点没有定义元素。

示例示例:

<parent>
  <definition> It is XYZ </definition>
</parent>
<parent>
  <definition> It is XYZ </definition>
</parent>
<parent>
</parent>
<parent>
  <definition> It is XYZ </definition>
</parent>
像这样'/ parent / definition'的XPath将只返回一个包含3个元素的数组。

这里,第3个元素没有定义元素。我在查询所有的定义。我想要一个数组作为输出,它将第一个,第二个和第四个元素作为“它是XYZ”,第三个元素应该是空字符串或nil。但我在数组中只获得了3个元素,值为1,2和4.我稍后在代码中使用此数组。我希望第三个元素是空白的。有可能实现它吗?

不确定是否重要,但每次拨打电话时xml内容都会不断变化。我的意思是,标签将是相同的,但元素和值的数量将会改变。我正在解析的XML非常大。一种解决方案是在循环中查询每个元素。它工作正常,但需要花费太多时间。因此,我可以在一个解析中获得所有定义的任何解决方案都非常有用。感谢。

4 个答案:

答案 0 :(得分:2)

在XPath 2.0中:

parent/string(definition)

在XPath 1.0中 - 亲爱的,为什么有人想要使用XPath 1.0? - (

答案 1 :(得分:1)

尽可能在底层libxml2中执行,

doc.xpath('(parent/definition|parent[not(definition)])/text()')

答案 2 :(得分:0)

您只获得三个元素,因为只存在三个“/ parent / definition”元素。如果在您的第​​三个父元素下,您有一个空的定义节点(即<definition/>),那么您将获得所需的结果。

如果您无法重构XML以在每个父级中放置默认的空定义元素,那么您将需要更改XPath以搜索“/ parent”,并创建一个循环每个父元素的函数并检查是否搜索每个父母的“定义”都会返回任何内容。如果没有,请让函数返回一个空字符串。

答案 3 :(得分:0)

这应该可以解决问题:

/parent/definition|/parent[not(definition)]

表示'所有/parent/definition元素加上所有不包含/parent子元素的definition元素