2014-01-22 54 views
1

我有以下類型的XML檢索類對象:如何創建並從列表

<?xml version="1.0" encoding="UTF-8"?> 
<RootNode> 
<childElem> 
<prop1 type="int">1</prop1> 
<prop2 type="int">2</prop2> 
</childelem> 
<childElem> 
<prop1 type="int">3</prop1> 
<prop2 type="int">4</prop2> 
</childelem> 
<childElem> 
<prop1 type="int">5</prop1> 
<prop2 type="int">6</prop2> 
</childelem> 
<childElem> 
<prop1 type="int">7</prop1> 
<prop2 type="int">8</prop2> 
</childelem> 
</RootNode> 

我已經定義的類來存儲所有的子元素作爲類的不同實例。 我想追加列表中的對象,然後檢索。

在這個xml中共有4個childelem。 創建每個對象後,我已打印每個對象的屬性。 在那裏我看到每個對象都有不同的屬性值。

但之後,當我試圖從列表中檢索for循環中的每個對象並打印每個檢索到的對象的屬性時,它將打印最後一個childelem對象四次。

這裏是代碼片段

def getObjects(self,xmlStr,elem): 
    objList = [] 
    root = ET.fromstring(xmlStr) 
    rootNode = root.find(elem) 
    for obj in rootNode.findall('childElem'): 
     myObj = Obj() 
     for props in obj: 
      myObj.populate(props.tag,props.text) 
     print(">>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<") 
     print(myObj.getProps()) 
     print(">>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<") 
     objList.append(myObj) 

    for obj1 in objList: 
     print(obj1.getProps()) 
     print("@@@@@@@@@@@@@@@@@@@@@@@@@@") 
    return objList 
class Obj: 
    properties = {} 

    def populate(self,name,value): 
     self.properties[name] = value 
    def getProps(self) 
     return self.properties 

我是新來的Python,可以有人解釋一下什麼是錯的? 爲什麼在循環檢索中只有最後一個childElem來了四次? 我該如何糾正錯誤?

這裏是出把

>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<< 
{'prop1': '1', 'prop2': '2'} 
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<< 
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<< 
{'prop1': '3', 'prop2': '4'} 
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<< 
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<< 
{'prop1': '5', 'prop2': '6'} 
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<< 
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<< 
{'prop1': '7', 'prop2': '8'} 
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<< 
{'prop1': '7', 'prop2': '8'} 
@@@@@@@@@@@@@@@@@@@@@@@@@@ 
{'prop1': '7', 'prop2': '8'} 
@@@@@@@@@@@@@@@@@@@@@@@@@@ 
{'prop1': '7', 'prop2': '8'} 
@@@@@@@@@@@@@@@@@@@@@@@@@@ 
{'prop1': '7', 'prop2': '8'} 
@@@@@@@@@@@@@@@@@@@@@@@@@@ 
+0

請問您可以在這裏發佈填充和getProps方法的代碼嗎? – gravetii

+0

你能顯示輸出嗎? – poke

+0

添加了代碼填充和getProps 也添加了輸出 – tintin

回答

0

您對Obj不同實例之間的類共享一個可變字典。如果你改變它是一個實例變量(通過設置Obj.__init__self.properties),代碼應該工作,只要你願意:

class Obj: 

    def __init__(self): 
     self.properties = {} 

    # The rest of Obj's methods. 

既然這樣,你的代碼創建一個字典,Obj.properties(這仍然是可以訪問通過實例上的self.properties)。然後myObj.populate調用每個更新一個字典,因此最後一個元素的詳細信息被打印4次。

+0

感謝您的幫助。這很奏效。 – tintin