2011-11-10 18 views
0

因此,使用我以前的'question'中找到的建議,我已經能夠得到我想要的結果。在Rails視圖中顯示Nokogiri的XML節點

我想知道是否有人有一個簡單的方法來顯示這些結果在一個Rails視圖,也有非XML內容。

我已經研究過XSLT,但對此不太瞭解,特別是與Rails無關,無法知道這是我應該花費時間的地方。如果是這樣,我會很喜歡一些關於如何在Rails視圖中使用XSLT的指針。

我所尋找的是要顯示的「sdnEntry」的結果(參見「XML Schema」瞭解詳情。)

一個列表,你會從「XML Schema」,不是所有的「sdnEntry」項目見有相同的元素。因此,我想顯示關於每個'sdnEntry'的以下信息,在適用的情況下省略任何空白元素。

請隨時在評論中提問。我非常感謝幫助。

編輯#1:XML文件可以找到here。 (6MB)

編輯#2:我寧願像<dl>/<dt><dd>列表。哎呀,我甚至會安排一張普通的舊桌子。至於空元素,你會從模式中看到,有些子元素(比如'firstName'或'address3'等)最少出現0次,因此每個'sdnEntry'都沒有找到。如果可能的話,我寧願不顯示空白的子元素。如果這是一個問題,如果需要的話,我最好還是空白。

編輯#3:結果將永遠是一個或多個'sdnEntry'項目的Nokogiri NodeSet。這就是我需要展示的全部內容。我相信,只要有足夠的指導或示例代碼,我可以將任何提供的解決方案應用於其他需求。

+1

當你說「顯示這些結果在Rails查看」你的意思是你想在一個「美麗的顯示原始XML '格式,像[此圖片](http://www.kirupa.com/net/images/xml_doc2.gif)?如果是這樣,語法着色是否重要?或者你的意思是你想從XML中提取信息並以相當的格式顯示它(例如,'

/
'列表自定義標記和格式化)?如果是這樣,你是否需要一個通用的解決方案(任何XML片段)或爲特定的結果量身定做? – Phrogz

+1

我不知道您在倒數第二段中的含義,_「我想顯示關於每個'sdnEntry'的以下信息」_。您是否打算提供您想要展示的特定元素的列表?或者你是否說過,即使沒有特定的子元素(例如,如果''被合法地省略),你仍然想在輸出中包含一個空元素? – Phrogz

+1

你忘了提供想要的輸出(我希望XML文檔有一些被提供的鏈接指向)。 –

回答

3

你還沒有給出足夠的細節,你真的想讓我給你一個很好的答案,但你已經給了一個答案。 :p

下面顯示瞭如何將XML文件加載到Nokogiri文檔中,創建一個Haml模板(這將成爲Rails視圖的一部分;如果您使用的是Erb或其他模板系統,請這麼說)運行了一個sdnEntry的列表,並執行所有XML的完全天真的巨大轉儲。如果你想要特定的節點,那麼你應該這麼說。

require 'nokogiri' 
require 'haml' 

# Haml helper to create a naive hierarchy of dl/dt/dd for any xml node 
def xml_to_dl(node) 
    haml_tag('dl') do 
    node.elements.each do |n| 
     haml_tag('dt',n.name) 
     if n.elements.empty? 
     haml_tag('dd',n.text) 
     else 
     haml_tag('dd'){ xml_to_dl(n) } 
     end 
    end 
    end 
end 

# This would be your page.haml view 
template = Haml::Engine.new <<'ENDHAML' 
%section#sdnList 
    %h1#sdnList SDN List Awesomeness 
    - if @sdns.empty? 
    %p.error No entries found. :(
    - else 
    %p Here are some exciting sdnEntries. Check em out! 
    - @sdns.each do |sdn| 
     %h2.name #{sdn.at('lastName').text}, #{sdn.at('firstName').text} 
     - xml_to_dl(sdn) 
ENDHAML 

# This would be in your controller 
doc = Nokogiri.XML(IO.read('sdn.xml')) 
doc.remove_namespaces! # Make life easier 
@sdns = doc.xpath('/sdnList/sdnEntry[firstName][position() < 2]') 

# This is taken care of by rails 
puts template.render(self) 

而這裏的輸出特定的模板,將創造:

<section id='sdnList'> 
    <h1 id='sdnList'>SDN List Awesomeness</h1> 
    <p>Here are some exciting sdnEntries. Check em out!</p> 
    <h2 class='name'>GONZALEZ BOHORQUEZ, Guillermo</h2> 
    <dl> 
    <dt>uid</dt> 
    <dd>11764</dd> 
    <dt>firstName</dt> 
    <dd>Guillermo</dd> 
    <dt>lastName</dt> 
    <dd>GONZALEZ BOHORQUEZ</dd> 
    <dt>sdnType</dt> 
    <dd>Individual</dd> 
    <dt>programList</dt> 
    <dd> 
     <dl> 
     <dt>program</dt> 
     <dd>SDNT</dd> 
     </dl> 
    </dd> 
    <dt>idList</dt> 
    <dd> 
     <dl> 
     <dt>id</dt> 
     <dd> 
      <dl> 
      <dt>uid</dt> 
      <dd>6139</dd> 
      <dt>idType</dt> 
      <dd>Cedula No.</dd> 
      <dt>idNumber</dt> 
      <dd>6185654</dd> 
      <dt>idCountry</dt> 
      <dd>Colombia</dd> 
      </dl> 
     </dd> 
     <dt>id</dt> 
     <dd> 
      <dl> 
      <dt>uid</dt> 
      <dd>6140</dd> 
      <dt>idType</dt> 
      <dd>Passport</dd> 
      <dt>idNumber</dt> 
      <dd>AJ772175</dd> 
      <dt>idCountry</dt> 
      <dd>Colombia</dd> 
      </dl> 
     </dd> 
     </dl> 
    </dd> 
    <dt>addressList</dt> 
    <dd> 
     <dl> 
     <dt>address</dt> 
     <dd> 
      <dl> 
      <dt>uid</dt> 
      <dd>17790</dd> 
      <dt>address1</dt> 
      <dd>c/o UNIVISA S.A.</dd> 
      <dt>city</dt> 
      <dd>Cali</dd> 
      <dt>country</dt> 
      <dd>Colombia</dd> 
      </dl> 
     </dd> 
     </dl> 
    </dd> 
    <dt>dateOfBirthList</dt> 
    <dd> 
     <dl> 
     <dt>dateOfBirthItem</dt> 
     <dd> 
      <dl> 
      <dt>uid</dt> 
      <dd>7272</dd> 
      <dt>dateOfBirth</dt> 
      <dd>20 Dec 1944</dd> 
      <dt>mainEntry</dt> 
      <dd>true</dd> 
      </dl> 
     </dd> 
     </dl> 
    </dd> 
    <dt>placeOfBirthList</dt> 
    <dd> 
     <dl> 
     <dt>placeOfBirthItem</dt> 
     <dd> 
      <dl> 
      <dt>uid</dt> 
      <dd>7273</dd> 
      <dt>placeOfBirth</dt> 
      <dd>Buga, Valle, Colombia</dd> 
      <dt>mainEntry</dt> 
      <dd>true</dd> 
      </dl> 
     </dd> 
     </dl> 
    </dd> 
    </dl> 
</section> 
+0

雖然我的知識的缺乏意味着我顯然沒有問這個問題的方式,讓你回答,你想辦法的問題,你的答案擔任我的目的只是罰款。它給了我足夠的信息來解決其餘問題。爲此,我感謝你。 – GreenPlastik

+0

@GreenPlastik太棒了! :) – Phrogz

相關問題