2011-11-05 76 views
1

所以我有一個XML文件(XML file)和一個模式(XML schema)。使用Nokogiri在Rails應用中根據用戶輸入搜索XML文件

我試圖創建一個快速Rails應用程序,允許用戶通過基於XML文件的「姓氏」元素是一個sdnEntry元素的兒童中進行檢索,

我沒有任何問題,設置鐵路鋼軌的應用程序,或搜索形式,我也能得到利用引入nokogiri,可以運行像簡單的命令加載XML文件...

xmldoc.css("lastName") 

...與返回一個節點集所有的' lastName'元素,不幸的是,這不夠好,因爲它不僅列出了直接在'sdnEntry'元素下面的'lastName'元素,甚至不會讓我開始從表單插入用戶的輸入。我正在想這樣的事情會工作...

xmldoc.xpath("/xmlns:sdnList/sdnEntry/lastName[text()='#{param[:name]}']") 

...但沒有奏效。奇怪的是,我什至不能得到...

xmldoc.xpath("/xmlns:sdnList/sdnEntry/lastName") 

...工作。對於XML文檔的Nokogiri或XPath或CSS查詢,我只是不夠了解如何從用戶輸入表單傳遞參數來創建適當的查詢,以便爲我返回正確的信息。

我試着翻翻Nokogiri DocumentationW3Schools XPath Tutorial。沒有快樂。

我真的很感謝任何指針,代碼片段或建議。謝謝。

+0

有關名稱空間和nokogiri的更多信息,請參閱http://stackoverflow.com/questions/4690737/nokogiri-xpath-namespace-query/4691008#4691008 –

回答

1
user_input = "CHOMBO"    # However you are getting it 
doc = Nokogiri.XML(myxml,&:noblanks) # However you are getting it 
doc.remove_namespaces!    # Simplify your life, if you're just reading 

# Find all sdnEntry elements with a lastName element with specific value 
sdnEntries = doc.xpath("/sdnList/sdnEntry[lastName[text()='#{user_input}']]") 

sdnEntries.each do |sdnEntry| 
    p [ 
    sdnEntry.at_xpath('uid/text()').content, # You can get a text node's contents 
    sdnEntry.at_xpath('firstName').text  # …or get an element's text 
    ] 
end 
#=> ["7491", "Ignatius Morgan"] 
#=> ["9433", "Marian"] 
#=> ["9502", "Ever"] 

,而不是要求的確切文字的價值,你可能也有興趣在XPath功能contains()starts-with()

2

您的問題與Nokogiri正在使用的XPath相同。您需要指定名稱空間在屬性中的含義。更多信息,請致電Nokogiri documentation

以下是查找項目的示例,使用您的參數可能也適用。

doc = Nokogiri::XML(File.read("sdn.xml")) 
doc.xpath("//sd:lastName[text()='INVERSIONES EL PROGRESO S.A.']", "sd"=>"http://tempuri.org/sdnList.xsd") 

>> [#<Nokogiri::XML::Element:0x80b35350 name="lastName" namespace=#<Nokogiri::XML::Namespace:0x80b44c4c href="http://tempuri.org/sdnList.xsd"> children=[#<Nokogiri::XML::Text:0x80b34e3c "INVERSIONES EL PROGRESO S.A.">]>] 
+0

感謝您的回覆Rob。上面的答案提前了一點,還包括了一些我可能感興趣的XPath函數的相關信息。也就是說,你的工作也是如此。謝謝 – GreenPlastik

相關問題