Непонятно, что вы хотите получить в качестве вывода; Вы хотите, чтобы HTML из оригинала был включен в XML, или просто содержание HTML? В будущем будет полезно, если вы включите пример того, что вы хотели, вместе с примером проблемы. Давайте решим обе проблемы. Во-первых, мы можем воспроизвести вашу проблему более просто так:
require 'nokogiri'
doc = Nokogiri::XML <<ENDXML
<root>
<p class="foo">42</p>
<p class="bar">99</p>
<p class="foo">17</p>
</root>
ENDXML
builder = Nokogiri::XML::Builder.new do |xml|
xml.items {
doc.css('.foo').each{ |o| xml.item_content = o }
}
end
puts builder.to_xml
#=> <?xml version="1.0"?>
#=> <items>
#=> <item_content=><p class="foo">42</p></item_content=>
#=> <item_content=><p class="foo">17</p></item_content=>
#=> </items>
Если вы хотели, чтобы содержимое ваших узлов HTML было только в XML, и предполагалось, что вы не хотите, чтобы знак равенства был частью имени тега, то:
builder = Nokogiri::XML::Builder.new do |xml|
xml.items {
doc.css('.foo').each{ |o| xml.item_content( o.text ) }
}
end
puts builder.to_xml
#=> <?xml version="1.0"?>
#=> <items>
#=> <item_content>42</item_content>
#=> <item_content>17</item_content>
#=> </items>
Если, с другой стороны, вам нужен необработанный HTML в вашем XML, но вы не хотите всех сущностей, сделайте его блоком CDATA:
builder = Nokogiri::XML::Builder.new do |xml|
xml.items {
doc.css('.foo').each{ |o| xml.item_content{ xml.cdata o } }
}
end
puts builder.to_xml
#=> <?xml version="1.0"?>
#=> <items>
#=> <item_content><![CDATA[<p class="foo">42</p>]]></item_content>
#=> <item_content><![CDATA[<p class="foo">17</p>]]></item_content>
#=> </items>
Блок XML CDATA позволяет использовать символы, обычно зарезервированные для разметки XML, без необходимости выражать их как символьные объекты.