【发布时间】:2014-03-28 14:51:30
【问题描述】:
我有一些 XML,其中的一个片段如下所示:
<osgb:departedMember>
<osgb:DepartedFeature fid='osgb4000000024942964'>
<osgb:boundedBy>
<gml:Box srsName='osgb:BNG'>
<gml:coordinates>188992.575,55981.029 188992.575,55981.029</gml:coordinates>
</gml:Box>
</osgb:boundedBy>
<osgb:theme>Road Network</osgb:theme>
<osgb:reasonForDeparture>Deleted</osgb:reasonForDeparture>
<osgb:deletionDate>2014-02-19</osgb:deletionDate>
</osgb:DepartedFeature>
</osgb:departedMember>
我正在解析它:
departedmembers = doc_root.findall('{http://www.ordnancesurvey.co.uk/xml/namespaces/osgb}departedMember')
for departedMember in departedMembers:
findWhat='{http://www.ordnancesurvey.co.uk/xml/namespaces/osgb}DepartedFeature'
fid = int(departedmember.find(findWhat).attrib['fid'].replace('osgb', ''))
theme=departedmember[0].findall('{http://www.ordnancesurvey.co.uk/xml/namespaces/osgb}theme')[0].text
reason=departedmember[0].findall('{http://www.ordnancesurvey.co.uk/xml/namespaces/osgb}reasonForDeparture')[0].text
date=departedmember[0].findall('{http://www.ordnancesurvey.co.uk/xml/namespaces/osgb}deletionDate')[0].text
有时原因或日期或两者都为空,即缺少元素,而不仅仅是内容为空。根据 XSD,这是合法的,但我在尝试选择不存在元素的文本时遇到属性错误。为了解决这个问题,我将原因和日期行放在 try 中,除了块,例如:
try:
date=departedmember[0].findall('{http://www.ordnancesurvey.co.uk/xml/namespaces/osgb}deletionDate')[0].text
except:
pass
这可行,但我讨厌像这样使用 except/pass,所以它让我想知道是否有更好的方法来解析这样的文档,其中某些元素是可选的。
【问题讨论】: