如何将带有&符号的字符串放在带有Nokogiri的xml文件中?

时间:2011-12-20 19:23:20

标签: ruby xml nokogiri cdata

我正在尝试在XML文件中包含图像的URL,并且URL查询字符串中的&符号将被删除:

bgdoc.xpath('//Master').each do |elem|
  part = elem.xpath('Part').inner_text
  image = imagehash[part]
  image = "" if image.blank?
  elem.xpath('Image').first.content = "<![CDATA[#{image}]]>"
  puts elem.xpath('Image').first.content
end

bgdoc稍后会在Builder的帮助下写出来。但不是单个元素,它会立即插入。这使得它与SO上发布的类似问题不同。

2 个答案:

答案 0 :(得分:2)

您应该使用create_cdata创建CDATA节点,然后add_child将其添加到文档中,只需将字符串分配给content,您就会&lt;!CDATA...在你的XML中,这不是很有用。

一个简短的例子应该说明这个过程:

xml   = '<Master><Image></Image><Image></Image></Master>'
bgdoc = Nokogiri::XML(xml)
cdata = bgdoc.create_cdata('/where?is=pan&cakes=house')
bgdoc.xpath('//Image').first.add_child(cdata)

然后,如果你bgdoc.to_xml,你会得到这样的东西:

<?xml version="1.0"?>
<Master>
    <Image><![CDATA[/where?is=pan&cakes=house]]></Image>
    <Image/>
</Master>

我认为这是你正在寻找的那种结果。但是,如果您只是将字符串分配给content

bgdoc.xpath('//Image').first.content = '<![CDATA[/where?is=pan&cakes=house]]>'

然后你得到这个XML:

<?xml version="1.0"?>
<Master>
    <Image>&lt;![CDATA[/where?is=pan&amp;cakes=house]]&gt;</Image>
    <Image/>
</Master>

,甚至没有CDATA节点。

答案 1 :(得分:1)

您是否尝试使用xml / html字符代码替换&符号?它应该工作。

&符号的代码是: &amp;

Click here for more information about character codes.