具有错误属性值的Nokogiri XML解析器

时间:2016-07-28 12:56:04

标签: ruby xml nokogiri

我无法找到关于Nokogiri(或暗示libxml)如何处理XML与HTML中的属性值之间差异的任何好文档。我们的一个项目仍然使用现已解散的Hpricot宝石,主要是因为它对属性的接受程度不高。

问题的关键似乎是我们的XML输入有未引用和缺少的属性值。我不是规范律师,但我认为大多数HTML变体都允许使用这些属性模式而XML则不然。

如果Nokogiri(或libxml)要严格,那么是否应该选择不严格的属性?如果我可以让HTML解析器不剥离命名空间,我可以使用它。

我们不能成为唯一拥有XML格式的团队,而这些格式并不完全是鱼或禽,而是介于两者之间。如果我们可以在源头修复它,我们可能会这样做,但与此同时我们必须按原样处理格式。

这是我在将属性发送给Nokogiri之前解决的问题:



ATTR_RE = /[^\s=>]+\s*(?:=(?:[^\s'">]+|\s*"[^"]*"|\s*'[^']*'))?/mo
ELEMENT_RE = /(<\s*[:\w]+)((?:\s+#{ATTR_RE})*)(\s*>)/mo

Nokogiri::XML(
  data.gsub(ELEMENT_RE) do |m|
    open, close = $1, $3
    ([open] +
     $2.scan(ATTR_RE).map do |atr|
       if atr =~ /=[ '"]/
         atr
       elsif atr =~ /=/
         "#{$`.strip}=\"#{$'.strip}\""
       else
         "#{atr.strip}=\"#{atr.strip}\""
       end
     end
    ) * ' ' + close
  end
)
&#13;
&#13;
&#13;

0 个答案:

没有答案