2014-01-22 2 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. Если вы измените его, чтобы быть переменной экземпляра (путем установки self.properties в Obj.__init__), код должен работать, как вы хотите:

class Obj: 

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

    # The rest of Obj's methods. 

Как можно заметить, что ваш код создает один словарь, Obj.properties (который по-прежнему доступен через self.properties на экземпляр). Затем myObj.populate каждый раз обновляет один словарь, поэтому данные для последнего элемента печатаются 4 раза.

+0

Спасибо за помощь. Это работает. – tintin

Смежные вопросы