为什么 REXML 无法解析换行符前面的 CDATA?

And*_*w M 4 ruby xml cdata rexml

我对 Ruby 很陌生,并且尝试使用 REXML 解析 XML 文档,该文档之前已(通过 REXML)进行了漂亮的打印,但结果有点不稳定。

某些 CDATA 部分在开始 XML 标记之后、但在 CDATA 块开始之前有一个换行符,在这些情况下,REXML 会将标记的文本解析为空。

  • 知道我是否可以让 REXML 来读取这些行吗?
  • 如果没有,我可以用正则表达式或其他东西预先重写它们吗?
  • 这还是有效的 XML 吗?

下面是一个 XML 文档示例(经过大量删节):

<?xml version="1.0" encoding="utf-8"?>
<root-tag>
    <content type="base64"><![CDATA[V2VsbCBkb25lISBJdCB3b3JrcyA6KQ==]]></content>
    <content type="base64">
        <![CDATA[VGhpcyB3b250IHdvcms=]]></content>

    <content><![CDATA[This will work]]></content>
    <content>
        <![CDATA[This will not appear]]></content>

    <content>
        Seems happy</content>
    <content>Obviously no problem</content>
</root-tag>
Run Code Online (Sandbox Code Playgroud)

这是我的 Ruby 脚本(精简为一个最小的示例):

require 'rexml/document'
require 'base64'
include REXML

module RexmlSpike
  file = File.new("ex.xml")
  doc = Document.new file
  doc.elements.each("root-tag/content") do |contentElement|
    if contentElement.attributes["type"] == "base64"
      puts "decoded: " << Base64.decode64(contentElement.text)
    else
      puts "raw: " << contentElement.text
    end
  end
  puts "Finished."
end
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

>> ruby spike.rb
  decoded: Well done! It works :)
  decoded:
  raw: This will work
  raw:

  raw:
          Seems happy
  raw: Obviously no problem
  Finished.
Run Code Online (Sandbox Code Playgroud)

我在 OSX Lion 上使用 Ruby 1.9.3p392。本练习的目标最终是将一些 BlogML 中的评论解析为 Disqus 使用的自定义导入 XML。

lig*_*h05 5

为什么

在覆盖之前的任何内容都会覆盖. 从字母到换行符(就像您发现的那样)或单个空格的任何内容。这是有道理的,因为您的示例正在获取元素的 ,并且空格算作文本。在您能够访问的示例中,这是因为文本为零。<![CDATA[]]><![CDATA[]]>text<![CDATA[]]>


解决方案

如果您查看Element 的文档,您会发现它有一个名为的函数cdatas()

获取所有 CData 子项的数组。不可变的。

因此,在您的示例中,如果您执行内部循环,contentElement.cdatas()您将看到所有丢失标签的内容。