2

頭にHTML5Shivを含む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

Nokogiricontent=のドキュメントは次のようになります。

文字列は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 に答える