【发布时间】:2009-07-21 07:41:22
【问题描述】:
我正在尝试编写一个函数,它将接受一个 xml 对象,任意数量的标签,由包含标签名称、属性和属性值的元组定义(例如 ('tag1', 'id', '1') ) 并尽可能返回最具体的节点。我的代码如下:
from xml.dom import minidom
def _search(object, *pargs):
if len(pargs) == 0:
print "length of pargs was zero"
return object
else:
print "length of pargs is %s" % len(pargs)
if pargs[0][1]:
for element in object.getElementsByTagName(pargs[0][0]):
if element.attributes[pargs[0][1]].value == pargs[0][2]:
_search(element, *pargs[1:])
else:
if object.getElementsByTagName(pargs[0][0]) == 1:
_search(element, *pargs[1:])
def main():
xmldoc = minidom.parse('./example.xml')
tag1 = ('catalog_item', 'gender', "Men's")
tag2 = ('size', 'description', 'Large')
tag3 = ('color_swatch', '', '')
args = (tag1, tag2, tag3)
node = _search(xmldoc, *args)
node.toxml()
if __name__ == "__main__":
main()
不幸的是,这似乎不起作用。这是我运行脚本时的输出:
$ ./secondsearch.py
length of pargs is 3
length of pargs is 2
length of pargs is 1
Traceback (most recent call last):
File "./secondsearch.py", line 35, in <module>
main()
File "./secondsearch.py", line 32, in main
node.toxml()
AttributeError: 'NoneType' object has no attribute 'toxml'
为什么不执行 'if len(pargs) == 0' 子句?如果我确实设法将 xml 对象返回给我的 main 方法,那么我可以将该对象传递给其他一些函数(这可能会更改节点的值,或附加子节点等)吗?
背景:使用python自动化测试流程,环境是winxp/vista/7上的cygwin,python版本是2.5.2。如果可能的话,我更愿意留在标准库中。
这是工作代码:
def _search(object, *pargs):
if len(pargs) == 0:
print "length of pargs was zero"
else:
print "length of pargs is %s" % len(pargs)
for element in object.getElementsByTagName(pargs[0][0]):
if pargs[0][1]:
if element.attributes[pargs[0][1]].value == pargs[0][2]:
return _search(element, *pargs[1:])
else:
if object.getElementsByTagName(pargs[0][0]) == 1:
return _search(element, *pargs[1:])
return object
【问题讨论】:
-
你的代码好像被扁平化了;您可能应该修复它,以便人们可以运行它。