我想使用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树来实现这样的任务。
答案 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>
标签。祝你好运!