1

我有这个 XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE pdf2xml SYSTEM "pdf2xml.dtd">

<pdf2xml>
    <page number="1">
        <text top="91">Rapport</text>
        <text top="102">foo</text>
    </page>
    <page number="2">
        <text top="91">Rapport</text>
        <text top="102">bar</text>
    </page>
    <page number="3">
        <text top="91">Rapport</text>
        <text top="102">asdf</text>
    </page>
</pdf2xml>

我正在这样做:

require 'nokogiri'
doc = Nokogiri::XML(File.read("file.xml"))
pages = doc.xpath("//page")
nodeset = pages[0].xpath("./text") + pages[1].xpath("./text")

我想在节点集中通过字符串找到一个节点,像这样

irb(main):011:0> nodeset.at_xpath("//text[text()[contains(., 'bar')]]")
=> #<Nokogiri::XML::Element:0x3fea6a4821d4 name="text" attributes=[#<Nokogiri::XML::Attr:0x3fea6a482170 name="top" value="102">] children=[#<Nokogiri::XML::Text:0x3fea6a481cac "bar">]>

但我不想使用//

我设法做到了

irb(main):018:0> nodeset.at_xpath("text()[contains(., 'bar')]")
=> #<Nokogiri::XML::Text:0x3fea6a481cac "bar">

但我想要整个<text>节点。

我对节点集的 xpath 查询应该是什么样的?

4

3 回答 3

0

比选择text()节点然后选择父节点更简单的是首先选择您想要的节点:

pages = doc.xpath("//page")
puts pages.xpath("text[contains(.,'bar')]")
#=> <text top="102">bar</text>

如果它让您感觉更好,您也可以显式测试元素的text()子节点,text而不是使用元素的等效文本:

pages.xpath("text[contains(text(),'bar')]")
于 2012-07-20T23:51:22.820 回答
0

我刚刚发现

nodeset.at_xpath("../text[text()[contains(., 'bar')]]")

也可以。

编辑:但我认为这比/...

于 2012-07-21T22:36:25.863 回答
0

要选择当前节点的父节点,您可以使用..例如,

/pdf2xml/page[1]

指向第一个<page>节点。如果你想再次选择它的父母,你可以写

/pdf2xml/page[1]/..

这将选择<pdf2xml>作为<page>.

在类似的行上,您可以在示例中使用..选择parent节点。

有关更多信息,您可以参考

希望这可以帮助。

于 2012-07-20T15:36:44.883 回答