And*_*w M 4 ruby xml cdata rexml
我对 Ruby 很陌生,并且尝试使用 REXML 解析 XML 文档,该文档之前已(通过 REXML)进行了漂亮的打印,但结果有点不稳定。
某些 CDATA 部分在开始 XML 标记之后、但在 CDATA 块开始之前有一个换行符,在这些情况下,REXML 会将标记的文本解析为空。
下面是一个 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。
在覆盖之前的任何内容都会覆盖. 从字母到换行符(就像您发现的那样)或单个空格的任何内容。这是有道理的,因为您的示例正在获取元素的 ,并且空格算作文本。在您能够访问的示例中,这是因为文本为零。<![CDATA[]]>
<![CDATA[]]>
text
<![CDATA[]]>
如果您查看Element 的文档,您会发现它有一个名为的函数cdatas()
:
获取所有 CData 子项的数组。不可变的。
因此,在您的示例中,如果您执行内部循环,contentElement.cdatas()
您将看到所有丢失标签的内容。