【问题标题】:Parsing XML file to get the folder structure?解析 XML 文件以获取文件夹结构?
【发布时间】:2019-04-27 10:51:32
【问题描述】:

我必须从我的 XML 文件中检索文件夹结构。

我的文件夹结构:

XML 文件(捕获上述文件夹结构)如下:

<?xml version="1.0" encoding="utf-8"?>
<serverfiles name="Test">
  <serverfiles name="Fail">
    <serverfiles name="Cam1">
      <serverfiles name="Mod1">
        <serverfiles name="2019-03-07" />
        <serverfiles name="2019-03-08" />
      </serverfiles>
      <serverfiles name="Mod2">
        <serverfiles name="2019-03-07" />
        <serverfiles name="2019-03-08" />
      </serverfiles>
    </serverfiles>
  </serverfiles>
  <serverfiles name="Pass">
    <serverfiles name="Cam1">
      <serverfiles name="Mod1">
        <serverfiles name="2019-03-07" />
        <serverfiles name="2019-03-08" />
      </serverfiles>
      <serverfiles name="Mod2">
        <serverfiles name="2019-03-07" />
        <serverfiles name="2019-03-08" />
      </serverfiles>
    </serverfiles>
  </serverfiles>
</serverfiles>

我的 Python 脚本:

import xml.etree.ElementTree as ET
path_file = ET.parse(r'../../folder_structure.xml')
r = path_file.getroot()
l = [i.attrib for i in r.iter() if i.tag=='serverfiles']
print(l)

以上代码产生以下结果:

[{'name': 'Test'}, {'name': 'Fail'}, {'name': 'Cam1'}, {'name': 'Mod1'}, {'name': '2019-03-07'}, {'name': '2019-03-08'}, {'name': 'Mod2'}, {'name': '2019-03-07'}, {'name': '2019-03-08'}, {'name': '通过'}, {'name': 'Cam1'}, {'name': 'Mod1'}, {'name': '2019-03-07'}, {'name': '2019-03-08'}, {'name': 'Mod2'}, {'name': '2019-03-07'}, {'name': '2019-03-08'}]

这里的问题是,整个文件夹结构丢失了(父子关系丢失了)。如何修改我的脚本,以便我可以将我的列表呈现为文件夹结构?

【问题讨论】:

    标签: python xml xml-parsing


    【解决方案1】:

    这是一个使用递归的可能解决方案:

    from pprint import pprint
    import xml.etree.ElementTree as ET
    
    def walk(e):
        name = e.attrib['name']
        children = [walk(c) for c in e if e.tag == 'serverfiles']
        struct = {'name': name}
        if children:
            struct['children'] = children
        return struct
    
    path_file = ET.parse(r'folder_structure.xml')
    r = path_file.getroot()
    s = walk(r)
    pprint(s)
    

    还有输出:

    {'children': [{'children': [{'children': [{'children': [{'name': '2019-03-07'},
                                                            {'name': '2019-03-08'}],
                                               'name': 'Mod1'},
                                              {'children': [{'name': '2019-03-07'},
                                                            {'name': '2019-03-08'}],
                                               'name': 'Mod2'}],
                                 'name': 'Cam1'}],
                   'name': 'Fail'},
                  {'children': [{'children': [{'children': [{'name': '2019-03-07'},
                                                            {'name': '2019-03-08'}],
                                               'name': 'Mod1'},
                                              {'children': [{'name': '2019-03-07'},
                                                            {'name': '2019-03-08'}],
                                               'name': 'Mod2'}],
                                 'name': 'Cam1'}],
                   'name': 'Pass'}],
     'name': 'Test'}
    

    编辑:更新代码以简化输出(基于评论):

    from pprint import pprint
    import xml.etree.ElementTree as ET
    
    def walk(e):
        name = e.attrib['name']
        children = [walk(c) for c in e if e.tag == 'serverfiles']
        return {name: children} if children else name
    
    path_file = ET.parse(r'folder_structure.xml')
    r = path_file.getroot()
    s = walk(r)
    pprint(s)
    

    输出:

    {'Test': [{'Fail': [{'Cam1': [{'Mod1': ['2019-03-07', '2019-03-08']},
                                  {'Mod2': ['2019-03-07', '2019-03-08']}]}]},
              {'Pass': [{'Cam1': [{'Mod1': ['2019-03-07', '2019-03-08']},
                                  {'Mod2': ['2019-03-07', '2019-03-08']}]}]}]}
    

    结构更简单,但现在您必须考虑两种可能的类型——dict,当文件夹有子文件夹时,str,如果它是叶节点(没有子文件夹)。

    【讨论】:

    • 有没有办法避免使用'children'标签?
    • 你说的children标签是什么意思?你是说childrenkey?您可以调整代码以满足您的需求。如果您指定结构应该是什么样的,我可能会尝试编辑答案。
    • 是的!我指的是“儿童”键。我想我可以调整代码以满足我的要求
    • @Virat 查看编辑后的答案。希望它更适合您的需求。
    猜你喜欢
    • 2012-08-16
    • 2018-04-05
    • 2018-02-10
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多