2

我有一个带有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]&gt;
#=>   &lt;script src='common/html5.js' type='text/javascript'&gt;&lt;/script&gt;
#=> &lt;![endif]-->

原始来源是有效的 XML/XHTML。如何让 Nokogiri 在调整期间不转换此评论中的实体?

4

1 回答 1

3

Nokogiri文档content=说:

字符串被 XML 转义,而不是被解释为标记。

replace因此,您可以使用和显式创建的注释节点将节点替换为新节点,而不是使用它:

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>
于 2012-07-03T17:53:58.767 回答