在Rails视图中使用Nokogiri显示XML节点



所以使用在我之前的"问题"中发现的建议,我已经能够得到我想要的结果。

我想知道是否有人有一个简单的方法来显示这些结果在Rails视图,也有非XML内容。

我研究过XSLT,但对它了解不够,特别是与Rails的关系不够,因此不知道我是否应该把时间花在XSLT上。如果是这样,我希望得到一些关于如何在Rails视图中使用XSLT的指导。

我要找的是显示'sdn条目'结果列表(详细信息请参见'XML模式')

正如您将从'XML Schema'中看到的,并非所有'sdnEntry'项都具有相同的元素。因此,我想显示关于每个'sdnEntry'的以下信息,在适用的情况下省略任何空元素。

请随时在评论中提问。我真的很感激你的帮助。

编辑#1:XML文件可以在这里找到。(6 mb)

编辑2:我更喜欢<dl>/<dt><dd>列表之类的东西。见鬼,我甚至满足于一张普通的旧桌子。至于空元素,您将从模式中看到,一些子元素(如'firstName'或'address3'等)的最小出现次数为0,因此不能为每个' snentry '找到。如果可能的话,我宁愿不显示空白的子元素。如果这是一个问题,如果需要的话,我愿意在最后留下空白。

编辑#3:结果将始终是一个或多个' sdenentry '项的Nokogiri节点集。这就是我所需要显示的。我相信,有了足够的指导或示例代码,我可以将任何提供的解决方案应用于其他需求。

你仍然没有给出足够的细节来让我给你一个好的答案,但是你已经给出了足够的细节来让我给一个答案。: 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>

相关内容

  • 没有找到相关文章

最新更新