2012-12-09 32 views
-3

與我真正想要製作的問題相比,標題相當簡單,但我不太確定如何使用它。 對於XML解析模塊我做,我需要它來添加鍵和屬性根據XML文檔的確切結構,例如:Python:在嵌套字典中設置密鑰

<Person> 
    <Name>Someone</Name> 
    <Age>25</Age> 
    <Skills> 
    <Skill>Projectile vomiting</Skill> 
    </Skills> 
</Person> 

應返回:

{ "Person" : { "Name" : "Someone", "Age" : "25", "Skills" : { "Skill" : "Projectile vomiting"}}} 

。沒有程序知道XML文檔的確切結構。它可以有任意數量的屬性,任意數量的嵌套屬性。

使用

Dict["key"]["anotherkey"]["yetanotherkey"] = Value 

將無法​​正常工作,因爲我不知道如果XML文檔使用3個屬性巢,或者如果屬性的巢中含有較多的巢。

我當時的想法是「打開節點」每次解析器遇到一個窩的開始時間,換句話說,如果語法分析器中

<Skills> and </Skills> 
達到

<Skill> 

將分配屬性

與dict [ 「人」] [ 「技能」],並遇到

</Skills> 

時,它會「關閉「節點,並繼續爲Dict [」Person「]分配屬性,但我不知道如何實現這一點(但我可以獲取文檔的所有值,屬性和節點)。

如何在不知道XML文檔的確切結構的情況下以正確的格式嵌套字典,如上所示?

+3

你的問題是什麼? –

+0

對帖子進行了編輯。抱歉! – Leon

+0

將XML結構存儲在嵌套字典中很重要嗎?如果是這樣,爲什麼?在Python中使用XML更方便。 –

回答

2

您可以使用與您在XML文檔中的點相對應的堆棧。每次遇到打開的標記時,都會將其推入堆棧,並開始爲stack.peek()中的值填充屬性。當您遇到結束標記時,您將最後一個標記從堆棧中彈出,並知道您現在將在堆棧的新頂部填充標記的屬性。

+0

如果堆棧中有[「人物」,「技能」],不會調用peek()方法返回「技能」,從而將值賦給Dict [「技能」],而不是Dict [ 「人」] [ 「技能」]? – Leon

+0

我明白你的意思了。您可以將參考文獻保存在堆棧中的字典中。每次遇到打開的標籤時,都會創建一個新的嵌套,例如prevLevel ['Skills'] = {}並將該新字典推送到堆棧。 –

+0

啊,太好了,謝謝! – Leon