2012-04-06 89 views
1

這是我第一篇文章。我剛剛開始使用Ruby,並使用REXML進行一些XML處理。我在這裏提出我的XML文件的一個小樣本:XPath-REXML-Ruby:選擇多個兄弟/祖先/子孫

<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教程和表達式以及本網站上的許多相關問題,並瞭解了軸和不同的概念,如祖先/兄弟姐妹等。但是,我真的很困惑,無法想象這個很容易。

我想知道如果我能得到任何幫助,或者如果有人可以指向我的在線資源「輕鬆」閱讀。

謝謝。

UPDATE:

我一直在努力,如不同的代碼組合:

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

代碼編譯,但不輸出任何東西。我想知道我做錯了什麼。

+0

示例XML有一個額外的頭。這是打算嗎? – joelparkerhenderson 2012-04-06 14:35:04

+0

糟糕。那是我的錯誤。固定。 :) – Shion 2012-04-06 22:22:30

回答

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" 
+0

我試過你的解決方案。它在irb中工作。然而,當我嘗試在我的代碼文件中實現它時,它會返回這個錯誤:'dirit.rb:91:'

':nil:NilClass(NoMethodError)'undefined method'text''我想知道我在做什麼錯誤。我在整個程序中使用文本方法。 – Shion 2012-04-06 22:12:51

+0

也許你在你的代碼中有一個錯字?嘗試將我的代碼剪切/粘貼到文件中並以此方式運行,看看它是否有效。還要確保你在mapId之前有一段時間。並提出這個答案。 :) – joelparkerhenderson 2012-04-06 22:26:21

+0

謝謝你的建議。我忽略了看看我的實際XML文件,它有一個稍微複雜的結構。它現在有效。我接受了你的答案並試圖加入它,但似乎我沒有最低15的聲望。我保證,當我有這個時,我會回來並且高興。 – Shion 2012-04-06 22:41:03