2

基本上问题说明了一切,如何将 xml 文件转换为 yaml?

我试过这个:

require 'active_support/core_ext/hash/conversions'
require 'yaml'

file = File.open("data/mconvert.xml", "r")
hash = Hash.from_xml(file.read)
yaml = hash.to_yaml
File.open("data/mirador.yml", "w") { |file| file.write(yaml) }

但是,我收到“异常解析”错误。我认为那是因为我在 xml 标记名称中有破折号,所以我将破折号替换为dashcharacterr但这仍然不起作用。

4

1 回答 1

2

如果我们看一下 XML 1.0 规范,我们会看到开始标记如下所示:

[40]    STag ::= '<' Name (S Attribute)* S? '>'

然后在其他地方,我们找到的定义Name

[4]     NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a]    NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]

你会注意到-不是NameStartChar这样:

<-vikings->1336162202</-vikings->

不是有效的 XML 和这部分代码:

hash = Hash.from_xml(file.read)

失败是因为您的文件不包含 XML,它包含看起来像 XML 但不是真正的 XML 的文本。

修复您的data/mconvert.xml文件以包含真正的 XML,然后重试。


如果您在 Rails 控制台中尝试一个简单的实验,您会看到发生了什么:

> Hash.from_xml('<-vikings->1336162202</-vikings->')
REXML::ParseException: #<REXML::ParseException: malformed XML: missing tag start
Line: 1
Position: 33
Last 80 unconsumed characters:
<-vikings->1336162202</-vikings->>

注意到“格式错误的 XML:缺少标签开始”吗?

于 2012-08-16T22:06:27.357 回答