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

現在のノードの親を選択するには、..たとえば、

/pdf2xml/page[1]

<page>最初のノードを指します。親をもう一度選択したい場合は、次のように書くことができます。

/pdf2xml/page[1]/..

<pdf2xml>これにより、の親であるノードが選択されます<page>

同様の行で、例のノード..を選択するために使用できます。parent

詳細については、これを参照できます

お役に立てれば。

于 2012-07-20T15:36:44.883 に答える
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 に答える