关闭XML标记后添加新行

时间:2013-05-20 16:09:54

标签: ruby

我知道有一些很棒的xml解析模块,但在使用它们之前我想开始自己动手,非常简单。

我想要的是任何结束标记最后都有换行符。我已经尝试了gsub的一些东西,它让我用换行符替换一个结束标记(实际上是从我给它的xml的未格式化段落中获得了一个体面可读的格式)。我还不知道如何附加" \ n"到现有的正则表达式匹配或将匹配的值保存到变量并使用添加的换行符重新插入。

同样,我知道有一些XML解析模块可以做得比我更好,但是我想知道我是否至少在我的逻辑路径上,或者是有更好的(从零开始)方式。

2 个答案:

答案 0 :(得分:2)

想要以艰难的方式做到这一点令人钦佩,而且每个程序员至少做过一次,但它非常容易出错。

我真的建议在解析器上构建,因为它会让你在更远的路上走得更远:

require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<xml><t1/><t2>foo</t2></xml>
EOT

doc.each do |node|
  node.replace(node.to_s << "\n") unless node.text?
end

puts doc.to_xml

看起来像:

<?xml version="1.0"?>
<xml>
  <t1/>
  <t2>foo</t2>
</xml>

天真的“我会用模式做”的问题是你可以遇到CDATA块:

<![CDATA[ This can contain > < " & <foo></bar> ]]>

尝试使用模式处理一些嵌入在标记之间的XML,然后查看编写代码以捕获问题需要多长时间,或者解除所造成的损害,并且你会厌恶地放弃。

答案 1 :(得分:0)

gsub是一个足够好的解决方案:

xml.gsub(/(<\/[^>]+>)/, '\1\n')