>我有以下XML树,只需要为具有ref-type
"corresp"
子xref
节点的contrib
标签获取名字和姓氏。
<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
标签中选择星号(两者都是合适的)。
问题实际上出在您的 XPath 上,用于获取姓氏和名字,即 XPath 对于以下行不正确:
puts surname = corrdetails.xpath( "//surname" ).text
puts givennames = corrdetails.xpath("//given-names").text
以 //
开头 XPath 意味着在文档中的任意位置查找节点。您只想查看corrdetails
节点,这意味着 XPath 需要以点开头,例如 .//
。
将两行更改为:
puts surname = corrdetails.xpath( ".//surname" ).text
puts givennames = corrdetails.xpath(".//given-names").text