我遇到了一个奇怪的问题。我有两个非常不同的代码版本来解决同样的问题,并遇到了同样的问题。
我已将问题简化为:
这是xml文件:
<Test>
<Object name="Ob1">
<List/>
</Object>
<Object name="Ob2">
<List>
<item>One</item>
<item>Two</item>
</List>
</Object>
<Object name="Ob3">
<List>
<item>Three</item>
<item>Four</item>
<item>Five</item>
</List>
</Object>
</Test>
这是python代码:
from lxml import etree
#Load XML
fileobject = open("list_test.xml", "r") #read-only
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse(fileobject, parser)
root = tree.getroot()
object_list = []
class TestClass():
name = None
list = []
for OB in root:
temp_ob = TestClass()
temp_ob.name = OB.get("name")
for SubElem in OB:
if SubElem.tag == "List":
for item in SubElem:
if item.tag == "item":
temp_ob.list.append(item.text)
object_list.append(temp_ob)
del temp_ob
for ob in object_list:
print ob.name
print ob.list
代码应该将列表中的所有<item>
元素存储在一个对象中,该对象本身存储在一个列表中。
但是,这是我得到的输出:
Ob1
['One', 'Two', 'Three', 'Four', 'Five']
Ob2
['One', 'Two', 'Three', 'Four', 'Five']
Ob3
['One', 'Two', 'Three', 'Four', 'Five']
为什么它会获取整个文档中的所有<item>
元素?
答案 0 :(得分:2)
TestClass.list
是类级属性,因此每个object_list.append()
都发生在同一个列表中。
例如:
class Foo(object):
lst = []
f1 = Foo()
f1.lst.append(1)
f2 = Foo()
f2.lst.append(2)
print f1.lst
print f2.lst
[1, 2]
[1, 2]
您应该将其设为实例级属性:
class Bar(object):
def __init__(self):
self.lst = []
b1 = Bar()
b1.lst.append(1)
b2 = Bar()
b2.lst.append(2)
print b1.lst
print b2.lst
[1]
[2]