【问题标题】:Parsing the root node, to fetch the entire file structure?解析根节点,获取整个文件结构?
【发布时间】:2019-07-03 12:54:53
【问题描述】:

我的 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 the leaf nodes(我以前的问题):

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'}]
}

我该如何解决这个问题?

【问题讨论】:

  • 可能值得删除那个裸露的except,以防你默默地吞下错误......
  • @JonClements 更新了问题,尽管它并没有真正的区别!!

标签: python xml tree xml-parsing


【解决方案1】:

如果出现异常,您的函数将返回 None。使用块try: except 捕获任何异常,因此您无法面对问题的原因,尝试从代码中删除此块以查看问题,或者捕获更具体的异常。 我看到'folderstructure' 没有name,你可以通过添加来解决这个问题 &lt;folderstructure name='some name'&gt; 在您的 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}

【讨论】:

  • 改变我使用 try-catch 的方式真的很有帮助。您的解决方案很优雅!我将它扩展到我的用例,而无需添加 name 属性!谢谢!!
猜你喜欢
  • 1970-01-01
  • 2019-03-02
  • 2011-07-12
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
相关资源
最近更新 更多