如何在XML中添加换行符

时间:2016-10-23 16:04:38

标签: ruby xml nokogiri

我有一个生成XML数据并将其保存到文件的脚本:

result_XML = Nokogiri::XML::Builder.new do |xml|
  xml.root {
    ...
    xml.job {
      xml.job_id            job_id
      xml.job_description   job_description
    }
  }
end

File.open("result.xml", 'w') { |f| f.write(result_XML.to_xml) }

job_description中,我的文字可以包含换行符(“\ n”)。我希望在打开生成的文件时显示它们,但是当我打开它时,所有描述都显示为一个字符串而没有任何中断。

我尝试了&#xD;&#xA;<[!CDATA[ ... ]]>,但没有任何效果。

示例:

job_id = 109504
job_description = "Requirements:\n 1. Be polite.\n 2. 20+ years old."

result_XML = Nokogiri::XML::Builder.new do |xml|
  xml.root {
    xml.job {
      xml.job_id_            job_id
      xml.job_description_   job_description
    }
  }
end

File.open("result.xml", 'w') { |f| f.write(result_XML.to_xml) }

现在如果我在浏览器中打开文件result.xml,我会得到:

<root>
  <job>
    <job_id>109504</job_id>
    <job_description>Requirements: 1. Be polite. 2. 20+ years old.</job_description>
  </job>
</root>

此错误表明此XML文件没有任何样式信息。

我想要的是:

<root>
  <job>
    <job_id>109504</job_id>
    <job_description>
      Requirements: 
      1. Be polite. 
      2. 20+ years old.
    </job_description>
  </job>
</root>

<br/>有效,但看起来像这样:

<root>
  <job>
    <job_id>109504</job_id>
    <job_description>
      Requirements: 
      <br/>
      1. Be polite. 
      <br/>
      2. 20+ years old.
      <br/>
    </job_description>
  </job>
</root>

如果在职位描述中有很多换行符,那就变得难以理解了。 所以我不希望显示<br/>标记。

非常感谢!

1 个答案:

答案 0 :(得分:0)

如果您希望以特定方式呈现XML树(例如使用换行符),而不依赖于浏览器的默认XML呈现模型(可能因浏览器而异),您最好这样做通过将结果显式转换为HTML来实现它。

例如:

require 'nokogiri'

result_XML = Nokogiri::XML::Builder.new do |xml|
  xml.root {
    xml.job {
      xml.job_id            1
      xml.job_description   %{ 
               my job
               another line
               one more line
      }
    }   
  }
end
result_HTML = Nokogiri::HTML::Builder.new do |doc|
  doc.html {
    doc.head {
      doc.script(:src => 'https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js')
    }
    doc.body(:onload => 'some_func();') {
      doc.pre(:class => "prettyprint lang-xml") {
        doc.text result_XML.to_xml
      }
    }
  }
end

File.open("result.html", 'w') { |f| f.write(result_HTML.to_html) }

或者,如果您仍希望将.xml作为主输出,则可以向其添加XSTL样式表:

 <?xml-stylesheet type="text/xsl" href="xml2html.xsl" ?>

这将使浏览器即时将其转换为HTML文档。

(注意!&#34; xml2html.xsl&#34;只是一个虚拟名称,您需要在HTML&#34;样式表中找到(或写入)真正的通用XML树并引用它相反,如果你想要这个工作)。