我有一个大型XML文件,中间包含以下内容:
<ArticleName>Article 1 <START </ArticleName>
显然libxml和其他XML库无法读取它,因为less-than符号会打开一个永不关闭的新标记。我的问题是,我能做些什么来自动修复这样的问题(最好是在Ruby中)?该解决方案当然适用于任何有这样错误的领域。有人说SAX解析可以解决问题,但我不确定它是如何工作的。
答案 0 :(得分:2)
您可以进行正则表达式搜索和替换,查找<(?=[^<>]*<)
并替换为<
。
在Ruby中,
result = subject.gsub(/<(?=[^<>]*<)/, '<')
这背后的理由是,您希望找到没有相应<
的{{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