我是一个相对较新的程序员,使用xml元素树来遍历成员数据的xml文件。我是通过迭代成员提取数据,并分配给了姓,名字和ID变量。
我的问题是,如果构件中的一个具有一个缺失元件(相对于缺少的元素内的数据),那么我的当前代码维护从最后一次迭代(部件)的变量的值。
我的数据:
<?xml version='1.0' ?>
<members>
<member>
<field name="surname">
<text>Smith</text>
</field>
<field name="firstname" type="text">
<text>John</text>
</field>
<field name="id" type="text">
<text>123</text>
</field>
</member>
<member>
<field name="surname" type="text">
<text>Bloggs</text>
</field>
<!--missing firstname element here -->
<field name="id" type="text">
<text>789</text>
</field>
</member>
<member>
<field name="surname" type="text">
<text>Jones</text>
</field>
<field name="firstname" type="text">
<text>Jane</text>
</field>
<field name="id" type="text">
<text>456</text>
</field>
</member>
</members>
我的代码:
tree = ET.parse('mydata.xml')
root = tree.getroot()
y = root.findall('member')
for member in y:
fields = member.findall("field")
for field in fields:
if field.get('name') == 'surname':
surname = field.find('text').text
if field.get('name') == 'firstname':
firstname = field.find('text').text
if field.get('name') == 'id':
id = field.find('text').text
print(surname, firstname, id)
所需的输出:
Smith John 123
Bloggs 789
Jones Jane 456
实际输出,其示出布罗格斯姓名为约翰而不是空白:
Smith John 123
Bloggs John 789
Jones Jane 456
我可以通过在每次成员迭代之前设置姓,名和id变量来避免这种情况:
for member in y:
surname = ''
firstname = ''
id = ''
fields = member.findall("field")
for field in fields:
if field.get('name') == 'surname':
surname = field.find('text').text
if field.get('name') == 'firstname':
firstname = field.find('text').text
if field.get('name') == 'id':
id = field.find('text').text
print(surname, firstname, id)
给出所需的结果:
Smith John 123
Bloggs 789
Jones Jane 456
但是这感觉有点变通方法-是否有另一种更Python的方式来实现这一目标?
答案 0 :(得分:1)
您拥有的东西实际上还可以阅读。但是,如果您真的想要,可以使用三元表达式
for member in y:
fields = member.findall("field")
for field in fields:
surname = field.find('text').text if field.get('name') == 'surname' else ''
firstname = field.find('text').text if field.get('name') == 'firstname' else ''
id = field.find('text').text if field.get('name') == 'id' else ''
print(surname, firstname, id)
答案 1 :(得分:1)
通过使用dict理解将数据放入dict也许更容易实现。这样,即使由于成员中没有字段而将其完全清空,字典也将始终被覆盖:
TextField
=>
<TextInput deafultValue={groupName}
<TextInput defaultValue={description}
答案 2 :(得分:0)
最好将这些东西隔离到自己的功能中。 是的,当您需要空白字段时,应该先将其重置