Python 解析根节点以获取整个文件结构?
我的python脚本读取一个XML文件,以给出文件夹结构 我的XML文件:Python 解析根节点以获取整个文件结构?,python,xml,tree,xml-parsing,Python,Xml,Tree,Xml Parsing,我的python脚本读取一个XML文件,以给出文件夹结构 我的XML文件: <?xml version="1.0" encoding="utf-8"?> <folderstructure> <folder name="Fail"> <folder name="Cam 1"> <folder name="Mod1"> <folder name="2019-04-09" />
<?xml version="1.0" encoding="utf-8"?>
<folderstructure>
<folder name="Fail">
<folder name="Cam 1">
<folder name="Mod1">
<folder name="2019-04-09" />
</folder>
</folder>
<folder name="Cam 2">
<folder name="Mod1">
<folder name="2019-04-09" />
</folder>
</folder>
</folder>
<folder name="Pass">
<folder name="Cam 1">
<folder name="Mod1">
<folder name="2019-04-09" />
</folder>
</folder>
<folder name="Cam 2">
<folder name="Mod1">
<folder name="2019-04-09" />
</folder>
</folder>
</folder>
</folderstructure>
但是上面的脚本会产生“None”作为输出
我期望的输出是:
{'children': [{'children': [{'children': [{'children': [{'name': '2019-04-09',
'path': '/Fail/Cam '
'1/Mod1/2019-04-09'}],
'name': 'Mod1'}],
'name': 'Cam 1'},
{'children': [{'children': [{'name': '2019-04-09',
'path': '/Fail/Cam '
'2/Mod1/2019-04-09'}],
'name': 'Mod1'}],
'name': 'Cam 2'}],
'name': 'Fail'},
{'children': [{'children': [{'children': [{'name': '2019-04-09',
'path': '/Pass/Cam '
'1/Mod1/2019-04-09'}],
'name': 'Mod1'}],
'name': 'Cam 1'},
{'children': [{'children': [{'name': '2019-04-09',
'path': '/Pass/Cam '
'2/Mod1/2019-04-09'}],
'name': 'Mod1'}],
'name': 'Cam 2'}],
'name': 'Pass'}]
}
如何解决此问题?如果出现异常,函数将不返回任何值。使用block try:除非您正在捕获任何异常,因此无法面对问题的原因,否则请尝试从代码中删除此块以查看问题,或者捕获更具体的异常。 正如我看到的“folderstructure”没有名称,您可以通过添加 在xml中 或者为根元素设置默认名称。 下面的代码似乎有效:
def walk(e, runningPath='', flag = 1):
try:
name = e.attrib['name']
except KeyError:
name = 'root'
if len(e)>0:
runningPath += '/' + name
children = [walk(c, runningPath, 0) for c in e if ((e.tag == 'folderstructure' and flag==1) or (e.tag=='folder' and flag == 0))]
print(children)
return {'name': name, 'children': children} if children else {'name': name, 'path': runningPath + '/' + name}
可能值得去掉那些裸露的部分,除非你在默默地吞咽错误…@JonClements更新了这个问题,尽管这并没有什么区别!!改变我使用try-catch的方式真的很有帮助。你的解决方案很优雅!我将其扩展到我的用例,而不必添加name属性!!谢谢
def walk(e, runningPath='', flag = 1):
try:
name = e.attrib['name']
except KeyError:
name = 'root'
if len(e)>0:
runningPath += '/' + name
children = [walk(c, runningPath, 0) for c in e if ((e.tag == 'folderstructure' and flag==1) or (e.tag=='folder' and flag == 0))]
print(children)
return {'name': name, 'children': children} if children else {'name': name, 'path': runningPath + '/' + name}