我使用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非常大。一种解决方案是在循环中查询每个元素。它工作正常,但需要花费太多时间。因此,我可以在一个解析中获得所有定义的任何解决方案都非常有用。感谢。
答案 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
元素