这是一个XML解析器代码片段,返回None值。这是一个大型XML文件,有很多这样的子字段:
<root>
<field name ="1">
<field name ="2" showname ="ZZZ">
<field name ="3" showname="YYY">
<field name ="4" showname="XXX"/>
</field>
</field>
</field>
findall()
查找带有标记的所有元素,这些元素是当前元素的直接子元素。我尝试了这个,但它返回时没有。它也没有打印。
def findXXX(field):
if field.get('name') == 'XXX' :
return field.get('showname')
else:
for fieldchild in field.findall('field'):
return findXXX(fieldchild)
如果我这样写,它会打印正确的值,但是返回时为无。
def findXXX(field):
if field.get('name') == 'XXX' :
print field.get('showname')
return field.get('showname')
else:
for fieldchild in field.findall('field'):
findXXX(fieldchild)
答案 0 :(得分:0)
在第二个版本中,您忽略递归调用的返回值。您的第一个版本至少仍返回该返回值:
for fieldchild in field.findall('field'):
return findXXX(fieldchild)
函数中的return
语句返回直接调用者,而不是findXXX()
最外面的第一次调用的调用者。
但是现在只有field
列表中 first field.findall()
的结果才会返回。您可能希望返回第一个而不是None
:
for fieldchild in field.findall('field'):
result = findXXX(fieldchild)
if result is not None:
return result
这会对每个field
元素进行递归搜索,并返回 first 这样的非None
递归调用的结果。
请注意,您 无法递送;你也可以使用XPath expression来搜索树而不必自己回复:
field.find(".//field[@showname='XXX']")
这会返回第一个field
标记,其name
属性设置为XXX
,递归搜索。
演示:
>>> from xml.etree import ElementTree as ET
>>> tree = ET.fromstring('''\
... <root>
... <field name ="1">
... <field name ="2" showname ="ZZZ">
... <field name ="3" showname="YYY">
... <field name ="4" showname="XXX"/>
... </field>
... </field>
... </field>
... </root>
... ''')
>>> tree.find(".//field[@showname='XXX']")
<Element 'field' at 0x108519bd0>
>>> tree.find(".//field[@showname='XXX']").get('name')
'4'
答案 1 :(得分:0)
我建议您使用BeautifulSoup。它易于学习,具有良好的文档。 http://www.crummy.com/software/BeautifulSoup/bs4/doc/
可以使用下面的代码实例化汤对象,其中“markup”是包含XML的字符串,或XML文件的输入文件句柄:
BeautifulSoup(markup, "xml")