Как я могу поместить строку с амперсандом в XML-файл с Nokogiri? - PullRequest
2 голосов
/ 20 декабря 2011

Я пытаюсь включить URL-адрес изображения в файл XML, и амперсанды в строке запроса 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 ]

2 голосов
/ 21 декабря 2011

Вы должны использовать 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 голос
/ 20 декабря 2011

Вы пытались заменить амперсанд его символьным кодом xml / html? Это должно работать.

Код для амперсанда: &amp;

Нажмите здесь для получения дополнительной информации о кодах символов.

...