【发布时间】:2019-02-01 12:49:24
【问题描述】:
我是一个相对较新的程序员,使用 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
实际输出,将 Bloggs 的名字显示为 John 而不是空白:
Smith John 123
Bloggs John 789
Jones Jane 456
我可以通过在每次成员迭代之前设置 surname、firstname 和 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
但这感觉有点解决方法 - 是否有替代的、更 Pythonic 的方法来实现这一点?
【问题讨论】:
-
是什么让你认为这不是 Python 的?
-
以这种方式重置变量感觉有点“手动”。 (虽然我不确定我的真正意思!)我的第一个想法是我可能需要更好地理解变量范围。
标签: python xml python-3.x elementtree