使用Julia将(非常)简单的XML文件转换为JSON

时间:2016-05-11 14:28:11

标签: json xml julia

我想使用Julia将this XML file转换为JSON。

这是一个非常简单的XML文件,带有标签/元素,但没有属性。

我找到了一些在线工具,但我更喜欢这样做 不要依赖这些服务,并拥有我自己的Julia代码。

LightXML可能有助于解析

using LightXML
xdoc = parse_string(s_xml)
xroot = root(xdoc)
...

JSON.jl将用于输出JSON文件

f = open("my.json", "w")
JSON.print(f, d)
close(f)

但我不知道如何遍历这个XML树来实现这样的任务。

2 个答案:

答案 0 :(得分:1)

几天前我们遇到了这个问题。我们没有在Julia中找到已经存在的实现,所以我们从头开始将一些函数放在一起。

基本解决方案是使用递归方法遍历XML。在此过程中,我们将标签和元素存储在DataStructures包中的一系列嵌套MultiDict对象中。和您一样,我们在开始时也使用LightXML包来解析XML文档。

然后,一旦我们将完整的XML读入我们的嵌套MultiDict,我们就开始将MultiDict(也使用递归)解包为具有适当格式的JSON的字符串。这部分有点棘手。

我们的实施相当简单;例如,我们完全忽略XML的属性。但我认为这种方法(即递归和嵌套的多字典)可能并不荒谬,应该让你走上正轨。



修改

我们的功能包含在一个模块中。你可以看看here

答案 1 :(得分:0)

您可以使用简单的递归方法和LightXML来浏览XML文档。这是一个粗糙的骨架:

using LightXML

function xout(xelement, mode)
    if mode == 1
        println("<",name(xelement), ">")
    else
        println("\t{", name(xelement), "}\t", content(xelement))
    end
end

function parse_node(c)
    e = XMLElement(c)
    if length(collect(child_elements(e))) > 0
        xout(e, 1)
        for child in child_elements(e)
            parse_node(child)
        end
    else
        xout(e, 0)
    end
end

xdoc = parse_string(rawxml)
xroot = root(doc)

for c in child_elements(xroot)
    parse_node(c)
end

对于你的文件,它给出了这样的东西:

<FinancialFunction>
    {Abbreviation}  ACOS
    {CamelCaseName} Acos
    {ShortDescription}  Vector Trigonometric ACos
    {GroupId}   Math Transform
<RequiredInputArguments>
<RequiredInputArgument>
    {Type}  Double Array
    {Name}  inReal
<OutputArguments>
<OutputArgument>
    {Type}  Double Array
    {Name}  outReal
<Flags>
    {Flag}  Line

当然,乐趣才刚刚开始!您必须为不同的元素等区分不同的<Type><Name>标签。祝你好运!