2012-10-01 45 views
2

我的XML文件是這樣的:將XML文件轉換爲鍵值結構的最佳算法是什麼?

<root> 
    <key0>value</key0> 
    <key1>value</key1> 
    <key2>value</key2> 
</root> 

人們很容易把這樣的文件轉換成鍵值結構。讓我們展示的結果在Python字典,例如:

{'key0': 'value', 'key1': 'value', 'key2': 'value'} 

現在他們添加嵌套元素:

<root> 
    <key0>value</key0> 
    <key1>value</key1> 
    <key2>value</key2> 
    <key3> 
     <sth0>value</sth0> 
     <sth1>value</sth1> 
    </key3> 
</root> 

仍然很容易:

{'key0': 'value', 'key1': 'value', 'key2': 'value', 'key3/sth0': 'value', 'key3/sth1': 'value'} 

我想你了問題的實質。那麼這個怎麼樣?

<root> 
    <key0>value</key0> 
    <key1>value</key1> 
    <key1> 
     <inner>value</inner> 
    </key1> 
    <key2>value</key2> 
    <key3> 
     <sth0>value</sth0> 
     <sth1>value</sth1> 
    </key3> 
    <key3> 
     <sth0>different value</sth0> 
     <sth1>different value</sth1> 
    </key3> 
    <key3> 
     <sth0>blah blah</sth0> 
     <sth1>blah blah</sth1> 
    </key3> 
</root> 

當然,我可以拿出一段時間思考後的東西,但東西告訴我我就滿足了越來越多的困難。所以問題是:是否有一種複雜的算法將類似簡單的XML文件中的值序列化爲鍵值形式?它必須是確定性的可序列化和不可序列化的,並且不會丟失任何值。元素的順序並不重要(例子中的Python dict不是隨機的選擇,它實際上是我試圖獲得的)。

我知道XML可能非常複雜(名稱空間,屬性等等),但事實並非如此。我需要正確解決的唯一問題是呈現的嵌套值和相同鍵的相關多重性。

+0

爲什麼不使用XML數據,並使用XPath查詢數據?有很多預先構建的庫已經實現了這一點。這個http://lxml.de甚至還有「物化」,這聽起來接近你想要的。我不會像你那樣命名子元素。我會將具有子元素的元素放入集合中。 – Adrian

+0

我知道將這些XML轉換爲'對象'或'文檔'將是最好的,但我現在無法做到這一點。這是因爲我有很多遺留代碼專門用於鍵值結構。我不得不重寫整個生態系統,現在這是不可能的。我需要一箇中間步驟。 –

+1

你可以在每個名字的末尾附加一些獨特的東西。像成爲Key0_unique,其中唯一是升序號碼或GUID。 – Adrian

回答

0

在每個名稱的末尾附加一些獨特的內容。就像變成Key0_unique一樣,其中unique是一個升序號或者guid。

(雖然如果你的「生態系統」現在和不斷增長的大,我會考慮整理了這一點,現在而不是以後。)

0

我認爲最好使用一些xml解析器。我有類似的問題,併爲我編寫我的XML解析器,但事實證明,這不是微不足道的,可以改變很多。我不能推薦下面的文章更說明問題,共同aproaches:

http://elegantcode.com/2010/08/07/dont-parse-that-xml/

如果你可以定義一個模式,你可以使用jaxb-好和容易!

+0

我使用常用​​解析器或我自己的解析器解析XML沒有問題(我實際上寫了其中的幾個)。我在創建一個將嵌套XML結構序列化爲鍵值結構的算法時遇到了問題。看到我的評論:http:// stackoverflow。COM /問題/ 12672801 /什麼,是最最好的算法對回合制的-XML的文件到-A-鍵值結構/ 12672837#comment17126711_12672801 –

相關問題