gpt4 book ai didi

ruby - 为什么 REXML 不能解析前面有换行符的 CDATA?

转载 作者:数据小太阳 更新时间:2023-10-29 02:17:42 24 4
gpt4 key购买 nike

我是 Ruby 的新手,正在尝试使用 REXML 解析 XML 文档,该文档之前已经(通过 REXML)漂亮地打印出来,但结果有些不稳定。

一些 CDATA 部分在开始 XML 标记之后但在 CDATA block 开始之前有一个换行符,在这些情况下,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>

这是我的 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

我得到的输出是:

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

raw:
Seems happy
raw: Obviously no problem
Finished.

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

最佳答案

为什么

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


解决方案

如果您查看 documentation for Element ,您会看到它有一个名为 cdatas() 的函数那:

Get an array of all CData children. IMMUTABLE.

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

关于ruby - 为什么 REXML 不能解析前面有换行符的 CDATA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18005250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com