我的头部有一个HTML5 Shiv的XHTML文件:
<!--[if lt IE 9]>
<script src='../common/html5.js' type='text/javascript'></script>
<![endif]-->
使用Nokogiri我需要调整该评论中的路径,剥离../
。但是,对注释节点.content
的任何更改都会产生XML输出,将>
和<
转换为实体:
XML = <<ENDXML
<r><!--[if lt IE 9]>
<script src='../common/html5.js' type='text/javascript'></script>
<![endif]--></r>
ENDXML
require 'nokogiri'
doc = Nokogiri.XML(XML)
comment = doc.at_xpath('//comment()')
comment.content = comment.content.sub('../','')
puts comment.to_xml
#=> <!--[if lt IE 9]>
#=> <script src='common/html5.js' type='text/javascript'></script>
#=> <![endif]-->
原始来源是有效的XML / XHTML。在调整过程中,如何让Nokogiri不转换此注释中的实体?
答案 0 :(得分:3)
字符串获取XML转义,而不是解释为标记。
因此,您可以使用replace
和明确创建的comment node替换节点,而不是使用它:
XML = <<ENDXML
<r><!--[if lt IE 9]>
<script src='../common/html5.js' type='text/javascript'></script>
<![endif]--></r>
ENDXML
require 'nokogiri'
doc = Nokogiri.XML(XML)
comment = doc.at_xpath('//comment()')
# this line is the new one, replacing comment.content= ...
comment.replace Nokogiri::XML::Comment.new(doc, comment.content.sub('../',''))
# note `comment` is the old comment, so to see the changes
# look at the whole document
puts doc.to_xml
输出是:
<?xml version="1.0"?>
<r>
<!--[if lt IE 9]>
<script src='common/html5.js' type='text/javascript'></script>
<![endif]-->
</r>