Выборка пути (от корневого узла) для всех конечных узлов? - PullRequest
0 голосов
/ 03 мая 2019

Мой скрипт Python читает XML-файл , чтобы получить структуру папок.

Мой XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<serverfiles name="Test">
  <serverfiles name="Fail">
    <serverfiles name="Cam1">
      <serverfiles name="Mod1">
        <serverfiles name="2019-01-07" />
        <serverfiles name="2019-01-08" />
      </serverfiles>
      <serverfiles name="Mod2">
        <serverfiles name="2019-02-07" />
        <serverfiles name="2019-02-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-04-07" />
        <serverfiles name="2019-04-08" />
      </serverfiles>
    </serverfiles>
  </serverfiles>
</serverfiles>

Python-скрипт:

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': name, 'children': children} if children else {'name': name, 'path': ''}

file = ET.parse(r'folder_structure.xml')
r = file.getroot()
s = walk(r)
pprint(s)

Это дает следующий вывод:

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

Но мой желаемый вывод :

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

Я ссылался получить доступ к родительскому узлу ElementTree и как получить xpath из root в python при анализе xml , но не смог найти решение.

Как получить путь (начиная с Root Node ) для каждого конечного узла при анализе файла XML ?

1 Ответ

1 голос
/ 03 мая 2019

Вы, вероятно, забыли отслеживать текущие имена, которые требовались для окончательного пути. Я могу ошибаться в случае общего использования, но конкретная проблема, которую вы задали, приведенный ниже сценарий должен работать.

from pprint import pprint
import xml.etree.ElementTree as ET


def walk(e, runningname=''):
    name = e.attrib['name']

    # TODO: checking whether this is the leaf node
    # perhaps there are better ways
    if len(e) > 0:
        runningname += f'/{name}'

    children = [walk(c, runningname) for c in e if e.tag == 'serverfiles']

    return {'name': name, 'children': children} if children else {'name': name, 'path': runningname}


file = ET.parse(r'r.xml')
r = file.getroot()
s = walk(r)
pprint(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...