我无法找到关于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;