如何将xml文件转换为yaml?

时间:2012-08-16 20:56:12

标签: ruby xml serialization yaml

基本上问题都说明了,如何将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) }

但是,我收到了“Exception parsing”错误。我认为那是因为我在xml标签名称中有破折号,所以我用dashcharacterr替换了破折号但是仍然没有用。

1 个答案:

答案 0 :(得分:2)

如果我们看一下XML 1.0规范,我们会看到start tags看起来像这样:

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

然后在其他地方,我们找到the definition of 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:缺少标记开始”?