python - 解析根节点,获取整个文件结构?
问题描述
我的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" />
</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>
我编写了以下脚本,参考Fetching the path( from root node ) for all 叶节点(我以前的问题):
def walk(e, runningPath='', flag = 1):
name = e.attrib['name']
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}
但是上面的脚本产生'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'}]
}
我该如何解决这个问题?
解决方案
如果出现异常,您的函数将返回 None 。使用块try: except
您正在捕获任何异常,因此您无法面对问题的原因,尝试从代码中删除此块以查看问题,或者捕获更具体的异常。正如我所见'folderstructure'
,没有name
,您可以通过添加
<folderstructure name='some name'>
您的 xml 或为您的root
元素设置默认名称来解决此问题。下面的代码似乎工作:
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}
推荐阅读
- html - 如何在单个功能块中多次渲染到同一个模板
- r - How to break a text in a label into two lines
- vba - How to extract PDF document from SAP GUI? (scripting)
- php - combining when() and whereBetween() methods in laravel query builder
- python - Python:如何使用带有巨大 csv 文件的 asyncio 从循环中发送异步请求?
- swift - 如何从方法内部更新类变量以使该变量对 Swift 中的其他类可见?
- swift - Codable:为新的非可选属性赋予默认值
- javascript - When I add .push function in my code for loop breaks
- node.js - sync function call in Node
- vba - Use vba selenium to choose option from drop menu