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 获取节点的兄弟姐妹”,它指出了可以在 Nokogiri 中使用的 CSS 兄弟选择器,但是,按照给出的示例,我的代码不加选择地给出了兄弟姐妹。

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.//

将两行更改为:

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