修复损坏的XML文件 - 删除额外的小于/大于标志

时间:2010-03-26 08:38:32

标签: xml ruby

我有一个大型XML文件,中间包含以下内容:

<ArticleName>Article 1 <START  </ArticleName>

显然libxml和其他XML库无法读取它,因为less-than符号会打开一个永不关闭的新标记。我的问题是,我能做些什么来自动修复这样的问题(最好是在Ruby中)?该解决方案当然适用于任何有这样错误的领域。有人说SAX解析可以解决问题,但我不确定它是如何工作的。

2 个答案:

答案 0 :(得分:2)

您可以进行正则表达式搜索和替换,查找<(?=[^<>]*<)并替换为&lt;

在Ruby中,

result = subject.gsub(/<(?=[^<>]*<)/, '&lt;')

这背后的理由是,您希望找到没有相应<的{​​{1}}。因此,正则表达式仅匹配>,如果它后面跟着另一个<,则不在其中。{/ p>

编辑:使用前瞻改进了正则表达式。我首先认为Ruby不支持前瞻,但确实如此。只是不看后面......

答案 1 :(得分:2)

Nokogiri支持处理错误XML的一些选项。这些可能会有所帮助:

http://rubyforge.org/pipermail/nokogiri-talk/2009-February/000066.html http://nokogiri.org/tutorials/ensuring_well_formed_markup.html

我只是弄乱了碎片,Nokogiri很好地处理了它:

#!/usr/bin/ruby

require 'rubygems'
require 'nokogiri'

doc = Nokogiri::XML('<?xml version="1.0"?><ArticleName>Article 1 <START  </ArticleName></xml>')
doc.to_s  # => "<?xml version=\"1.0\"?>\n<ArticleName>Article 1 <START/></ArticleName>\n"
doc.errors # => [#<Nokogiri::XML::SyntaxError: error parsing attribute name