我有这个XML文件,我想使用Python的xml.etree读取一些数据:
<a>
<b>
<AuthorName>
<GivenName>John</GivenName>
<FamilyName>Smith</FamilyName>
</AuthorName>
<AuthorName>
<GivenName>Saint</GivenName>
<GivenName>Patrick</GivenName>
<FamilyName>Thomas</FamilyName>
</AuthorName>
</b>
</a>
我希望得到的结果是:
John Smith
Saint Patrick Thomas
你可能已经注意到,有时我有1个GivenName标签,有时我有2个GivenName标签
我做的是:
from xml.etree import ElementTree as ET
xx = ET.parse('file.xml')
authorName = xx.findall('.//AuthorName')
for name in authorName:
print(name[0].text + " " + name[1].text)
它与1 GivenName标签一起工作正常,但是当我有2时它没有。
我该怎么办?
谢谢!
答案 0 :(得分:2)
试试这个:
from xml.etree import ElementTree as ET
xx = ET.parse('file.xml')
authorName = xx.findall('.//AuthorName')
for name in authorName:
nameStr = ' '.join([child.text for child in name])
print(nameStr)
您必须查看authorName中的所有子标记,获取其文本,然后将它们加入您的nameStr。
答案 1 :(得分:1)
看起来你并没有真正使用你的循环。这样的事情可能会对你有所帮助:
from xml.etree import ElementTree as ET
xx = ET.parse('file.xml')
authorName = xx.finall('.//AuthorName')
nameParts = []
for name in authorName:
fullName.append(name)
fullName = ' '.join(nameParts)
print(fullName)
现在,您可以在这里做一件让您的生活更轻松的事情是了解列表理解。例如,以上内容可以简化为:
from xml.etree import ElementTree as ET
xx = ET.parse('file.xml')
authorName = xx.finall('.//AuthorName')
fullName = ' '.join((name.text for name in xx.findall('.//AuthorName')))
print(fullName)
注意:这实际上并未经过测试。可能存在拼写错误。