所以使用在我之前的"问题"中发现的建议,我已经能够得到我想要的结果。
我想知道是否有人有一个简单的方法来显示这些结果在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>