Отображение узлов XML с Nokogiri в представлении Rails - PullRequest
0 голосов
/ 10 ноября 2011

Таким образом, используя совет из моего предыдущего вопроса , я смог получить желаемые результаты.

Мне было интересно, есть ли у кого-нибудь простой способ отобразить эти результаты в представлении Rails, которое также имеет не XML-контент.

Я изучил XSLT, но недостаточно знаю об этомособенно в отношении Rails, чтобы знать, где я должен проводить свое время.Если это так, я хотел бы получить несколько советов о том, как я могу использовать XSLT в представлениях Rails.

Мне нужно отобразить список результатов 'sdnEntry' (см. * Схема XML 'для деталей.)

Как вы увидите из' XML-схемы ', не все элементы' sdnEntry 'имеют одинаковые элементы.Поэтому я хотел бы отобразить следующую информацию о каждом 'sdnEntry', пропуская все пустые элементы, где это применимо.

Пожалуйста, не стесняйтесь задавать вопросы в комментариях.Я действительно ценю помощь.

РЕДАКТИРОВАТЬ # 1: XML-файл можно найти здесь .(6 МБ)

РЕДАКТИРОВАТЬ # 2: Я бы предпочел что-то вроде <dl>/<dt><dd> список.Черт, я бы даже согласился на простой старый стол.Что касается пустых элементов, из схемы вы увидите, что некоторые дочерние элементы (например, 'firstName' или 'address3' и т. Д.) Имеют 0 минимальных вхождений и, следовательно, не найдены для каждого sdnEntry.Если возможно, я бы не хотел показывать пустые дочерние элементы.Если это проблема, то в конце я буду в порядке с пробелами, если потребуется.

РЕДАКТИРОВАТЬ # 3: Результатом всегда будет Nokogiri NodeSet одного или нескольких элементов 'sdnEntry'.Это все, что мне нужно отобразить.Я уверен, что при наличии достаточного количества руководств или примеров кода я мог бы применить любое предоставленное решение для других нужд.

1 Ответ

3 голосов
/ 17 ноября 2011

Вы все еще не предоставили достаточно подробностей о том, что вы на самом деле хотите, чтобы я дал вам хороший ответ, но вы дали достаточно, чтобы получить ответ.: 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>
...