0

我知道那里有一些很棒的 xml 解析模块,但在使用它们之前,我想尝试一下我自己的非常简单的解析模块。

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

同样,我知道有 XML 解析模块会比我做得更好,但我想看看我的逻辑是否至少在正确的道路上,或者有更好的(从头开始)方法。

4

2 回答 2

3

想要以艰难的方式去做是令人钦佩的,每个程序员至少都会做一次,但它非常容易出错。

我真的建议在解析器上构建,因为它会让你走得更远,而且麻烦更少:

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,然后查看编写代码以捕获问题或解除所造成的损害需要多长时间,然后您会厌恶地放弃。

于 2013-05-20T18:02:48.740 回答
0

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

xml.gsub(/(<\/[^>]+>)/, '\1\n')
于 2013-05-20T16:13:49.463 回答