【问题标题】:nokogiri: xml to htmlnokogiri: xml to html
【发布时间】:2009-11-26 01:14:12
【问题描述】:

我只想进行一些直接的转换(几乎只是搜索和替换),但我无法将东西放在适当的位置 - 我最终发现链接不合适并且内容重复。我确定我在尝试遍历 xml 时做了一些愚蠢的事情:)

我正在尝试:

builder = Nokogiri::HTML::Builder.new do |doc|
 doc.html {
  doc.body {
   doc.div.wrapper! {
    doc.h1 "Short"

      xm.css('paragraph').each do |para|

        doc.h3.para(:id => para['number']) { doc.text para['number'] }

        doc.p.narrativeparagraph {

           xm.css('paragraph inner-section').each do |section|
              doc.span.innersection { doc.text section.content 

           xm.css('inner-section xref').each do |xref|
              doc.a(:href => "#" + xref['number']) { doc.text xref['number'] }
           end

           xm.css('paragraph inner-text').each do |innertext|
               doc.span.innertext { doc.text innertext.content }
           end

                } end #inner-section                 

                }

          end#end paragraph
        }#end wrapper
      }#end body
    }#end html
  end#end builder

开:

<?xml version="1.0"?>

<looseleaf>

<paragraph number="1">
  <inner-section> blah one blah <xref number="link1location"></xref>
    <inner-text> blah two blah blah </inner-text>
     blah three
  </inner-section>
</paragraph>

<paragraph number="2">
<inner-section> blah four blah <xref number="link2location"></xref>
    <inner-text>blah five blah blah </inner-text>
         blah six
</inner-section>
</paragraph>

</looseleaf>

创建:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC- html40/loose.dtd">
<html>
<body>
<div id="wrapper">
<h1>Short</h1>
<h3 class="para" id="1">1</h3>
<p class="narrativeparagraph">
 <span class="innersection"> blah one blah <a href="#link1location">link1location</a>
 <span class="innertext"> blah two blah blah </span>
     blah three</span>
</p>

<h3 class="para" id="2">2</h3>
<p class="narrativeparagraph">
 <span class="innersection"> blah four blah <a ref="#link2location">link2location</a>
 <span class="innertext">blah five blah blah </span>
     blah six</span></p>

我一直在尝试各种方法以使其正常工作,基本的 html 结构还可以,但段落的子级是一团糟 - 任何帮助将不胜感激。 问候, 里奇

【问题讨论】:

  • 任何和我在同一条船上的菜鸟 - 我已经放弃尝试使用 Builder,我正在缓慢但肯定地到达那里: frag.xpath("//paragraph").each { |div| div.name = "p"; div.set_attribute("class" , "narrativeparagraph") } frag.cs​​s('inner-section xref').each { |xref|外部参照名称=“一个”; xref.set_attribute("href" , "#" + xref['number']);外部参照内容 = 外部参照['编号'] }
  • 您作为示例给出的 html - 是您喜欢 构建的吗?你能提供一个实际结果的例子吗?

标签: html xml transform nokogiri


【解决方案1】:

有很多方法可以做到这一点,但如果你坚持使用 Builder 方式,我会制作一个将 &lt;paragraph&gt; 转换为 &lt;p&gt; 的函数。

builder = Nokogiri::HTML::Builder.new do |doc|
  doc.html {
    doc.body {
      doc.div.wrapper! {
        doc.h1 "Short"
        xm.css('paragraph').each do |para|
          doc << translate_paragraph para.dup
        end #para
    }#end body
  }#end html
end#end builder

def translate_paragraph(p)
  # Change '<paragraph>' to '<p>'
  p.name = 'p'

  # Change '<innersection>' to '<span class='innersection'>'
  p.css('innersection').each { |tag|
    tag.name = 'span'
    tag['class'] = 'innersection'
  }

  # ...
end

并不完美,但它适用于 Builder。

我也会考虑 XSLT,或者递归遍历 HTML 树并从那里构建。

【讨论】:

    猜你喜欢
    • 2013-02-16
    • 2012-12-27
    • 2017-05-07
    • 2017-07-13
    • 2013-07-10
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多