XPath-REXML-Ruby:选择多个兄弟/祖先/后代

时间:2012-04-06 11:57:29

标签: ruby xml xpath xml-parsing rexml

这是我在这里的第一篇文章。我刚开始使用Ruby并且正在使用REXML进行一些XML处理。我在这里提供了一小段xml文件样本:

  <record>
     <header>
        <identifier>oai:lcoa1.loc.gov:loc.gmd/g3195.ct000379</identifier>
        <datestamp>2004-08-13T15:32:50Z</datestamp>
        <setSpec>gmd</setSpec>
     </header>
     <metadata>
           <titleInfo>
              <title>Meet-konstige vertoning van de grote en merk-waardige zons-verduistering</title>
           </titleInfo>
     </metadata>
  </record>

我的目标是将标记中的最后一个数值与我从数组中获得的值列表进行匹配。我通过以下代码片段实现了这一点:

ids = XPath.match(xmldoc, "//identifier[text()='oai:lcoa1.loc.gov:loc.gmd/"+mapid+"']")

获得了我想调查的特定标识符后,现在我想返回并选择然后选择在该节点中获取该特定标识符的值。

我已经查看了XPath教程和表达式以及本网站上的许多相关问题,并了解了轴和不同的概念,如祖先/兄弟等等。但是,我真的很困惑,无法弄清楚这一点容易。

我想知道我是否可以得到任何帮助,或者是否有人可以指向我“易于”阅读的在线资源。

谢谢。

更新:

我一直在尝试各种代码组合,例如:

idss = XPath.match(xmldoc, "//identifier[text()='oai:lcoa1.loc.gov:loc.gmd/"+mapid+"']/parent::header/following-sibling::metadata/child::mods/child::titleInfo/child::title")

代码编译但不输出任何内容。我想知道我做错了什么。

1 个答案:

答案 0 :(得分:1)

这是使用XPath完成它的方法,然后进入记录,然后使用XPath获取标题:

require 'rexml/document'
include REXML

xml=<<END
  <record>
    <header>
      <identifier>oai:lcoa1.loc.gov:loc.gmd/g3195.ct000379</identifier>
      <datestamp>2004-08-13T15:32:50Z</datestamp>
      <setSpec>gmd</setSpec>
    </header>
    <metadata>
      <titleInfo>
        <title>Meet-konstige</title>
      </titleInfo>
    </metadata>
  </record>
END

doc=Document.new(xml)
mapid = "ct000379"
text = "oai:lcoa1.loc.gov:loc.gmd/g3195.#{mapid}"

identifier_nodes = XPath.match(doc, "//identifier[text()='#{text}']")
record_node = identifier_nodes.first.parent.parent
record_node.elements['metadata/titleInfo/title'].text
=> "Meet-konstig"