因此,src属性在Nokogiri(或libxml2?)中似乎是神圣的:
> Nokogiri::HTML.fragment('<foo src="{{bar}}"></foo>').to_html
=> "<foo src="%7B%7Bbar%7D%7D"></foo>"
是否有任何方法可以避免URL编码此属性(至少对于自定义元素)?to_xml不是一个选项(我不能保证一个xhtml安全的环境)。
我认为你期望Nokogiri做一些它不应该做的事情。
<foo src="{{bar}}"></foo>
不是HTML,因为 看看Nokogiri对你的片段做了什么,这是它作为HTML的结果: 如果它被正确处理为XML会发生什么: Nokogiri有一组在解析HTML时使用的规则,但它基本上是在内部将HTML DOM转换为XML DOM,这在将其解析为HTML后查看文档检查时是可见的。转换是在文档输出期间发生的。您可以使用解析选项推动Nokogiri,并让它输出您想要的内容。 如果你觉得这是Nokogiri的不当行为,我强烈建议你在bug报告中向维护者提出。他们偶尔会来这里回答问题,但你会在Nokogiri谈话邮件列表或git中心页面上得到更快的回复。 如果你的标记不是有效的HTML,那么Nokogiri将尝试强制转换成某种有效的HTML。此时,您应该能够从中获得合理的XML、XHTML或HTML,这里的"合理"意味着它在语义上是有效的,只是可能不完全符合您的期望。<foo>
不是已知的HTML标记。另一方面,它可以是一个有效的XML标记。require 'nokogiri'
doc = Nokogiri::HTML.fragment('<a src="{{bar}}"></a>')
# => #(DocumentFragment:0x3fe6d6897ba8 {
# name = "#document-fragment",
# children = [
# #(Element:0x3fe6d6897900 {
# name = "a",
# attributes = [
# #(Attr:0x3fe6d68978d8 { name = "src", value = "{{bar}}" })]
# })]
# })
doc.to_s
# => "<a src="%7B%7Bbar%7D%7D"></a>"
doc = Nokogiri::XML.fragment('<a src="{{bar}}"></a>')
# => #(DocumentFragment:0x3fe6d68930d0 {
# name = "#document-fragment",
# children = [
# #(Element:0x3fe6d6892eb4 {
# name = "a",
# attributes = [
# #(Attr:0x3fe6d6892e8c { name = "src", value = "{{bar}}" })]
# })]
# })
doc.to_s
# => "<a src="{{bar}}"/>"
doc.to_xml
# => "<a src="{{bar}}"/>"
doc.to_html
# => "<a src="%7B%7Bbar%7D%7D"></a>"