【问题标题】:How can i put a string with an ampersand in an xml file with Nokogiri?如何使用 Nokogiri 在 xml 文件中放置一个带 & 符号的字符串?
【发布时间】:2011-12-20 19:23:19
【问题描述】:

我正在尝试在 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 上发布的类似问题不同。

【问题讨论】:

    标签: ruby xml nokogiri cdata


    【解决方案1】:

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

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

    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 节点。

    【讨论】:

      【解决方案2】:

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

      & 符号的代码是: &amp;amp;amp;

      Click here for more information about character codes.

      【讨论】:

      • 这里真正的问题是 AKWF 实际上并没有将 CDATA 节点添加到他们的文档中,他们只是添加了一个字符串,该字符串将被 XML 编码以转义 &lt;&gt;&amp;amp;amp;。使用 &amp;amp;amp; 而不是 &amp;amp;amp; 将在 XML 中产生 &amp;amp;amp;
      • 事情就是这样。
      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 2018-03-17
      • 2020-06-12
      相关资源
      最近更新 更多