0

次の XML ツリーがあり、 の子ノードをcontrib持つタグの名と姓のみを取得する必要があります。xrefref-type "corresp"

<pmc-articleset>
 <article>
  <front>
    <article-meta>
      <contrib-group>
        <contrib contrib-type="author">
          <name>
            <surname>Wereszczynski</surname>
            <given-names>Jeff</given-names>
          </name>
          <xref rid="aff1" ref-type="aff"/>
        </contrib>
        <contrib contrib-type="author">
          <name>
            <surname>Andricioaei</surname>
            <given-names>Ioan</given-names>
          </name>
          <xref rid="aff1" ref-type="aff"/>
          <xref ref-type="corresp" rid="cor1">*</xref>
        </contrib>
      </contrib-group>
    </article-meta>
  </front>
</article>
</pmc-articleset>

Nokogiri で使用できる CSS 兄弟セレクターを指摘する「Nokogiri でノードの兄弟を取得する」を見ましたが、与えられた例に従って、私のコードは無差別に兄弟を与えます。

require "Net/http"
require "nokogiri"
    url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?id=PMC1637560&db=pmc"
    xml_data = Net::HTTP.get_response(URI.parse(url)).body
    parsedoc = Nokogiri::XML.parse(xml_data)
    corrdetails = parsedoc.at('contrib:has(xref[text()="*"])')
    puts surname = corrdetails.xpath( "//surname" ).text
    puts givennames = corrdetails.xpath("//given-names").text

=> WereszczynskiAndricioaei
=> JeffIoan

<xref ref-type="corresp">*</>次の出力であるという条件の下で、兄弟ノードのみが必要です。

=> Andricioaei
=> Ioan

私は現在、これを参照せずにタグref-type内のアスタリスクを選択して実装しています (どちらかが適切です)。xref

4

1 に答える 1

2

問題は、実際には、姓と名を取得するための XPath にあります。つまり、XPath が次の行に対して正しくありません。

puts surname = corrdetails.xpath( "//surname" ).text
puts givennames = corrdetails.xpath("//given-names").text

で XPath を開始すると、ドキュメント内の任意の場所//でノードを検索することになります。ノード内のみを参照する必要があるため、XPath はドットで開始する必要があります (例: .corrdetails.//

2 行を次のように変更します。

puts surname = corrdetails.xpath( ".//surname" ).text
puts givennames = corrdetails.xpath(".//given-names").text
于 2013-11-06T15:33:52.267 に答える