2016-05-11 87 views
2

我想使用Julia將this XML file轉換爲JSON。使用Julia將(非常)簡單的XML文件轉換爲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樹來實現這樣的任務。

回答

1

幾天前我們遇到了這個問題。我們在Julia沒有找到已經存在的實現,所以我們從頭開始組合一些函數。

基本的解決方案是使用遞歸方法遍歷XML。一路上,我們將標籤和元素存儲在DataStructures包中的一系列嵌套的MultiDict對象中。和我們一樣,我們也在開始時使用LightXML包來解析XML文檔。

然後,一旦我們將完整的XML讀入我們嵌套的MultiDict,我們開始將MultiDict(也使用遞歸)解壓縮爲具有適當格式的JSON字符串。這部分有點棘手。

我們的實現相當簡單;例如,我們完全忽略XML的屬性。但我認爲這種方法(即遞歸和嵌套多字典)可能並不可笑,應該讓你走上正軌。



編輯:

我們的功能模塊中包裹起來。你可以看看here

+0

您的代碼是否可用(或可否提供)? –

+0

@ DavidP.Sanders當然,我正在清理它並將它放在Github上。我會稍微發佈鏈接。 – paulstey

+0

@paulstey,這將是非常好的。 –

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>標籤等。祝你好運!

+0

它看起來不是JSON文件 –

+0

@FemtoTrader你問「但我不知道如何遍歷這個XML樹來實現這樣的任務。」 – daycaster