Nano Hash - криптовалюты, майнинг, программирование

Создание Python xml из списка с уровнями элементов

Это первый раз, когда я работаю с обработкой xml.

Следующий список Python содержит все элементы/узлы, которые будут использоваться для создания окончательного xml. Каждый элемент списка также является списком, состоящим из пары элемент/узел и уровня.

Например:

['корень', 1]

«root» — это имя элемента, а 1 — это уровень или положение «root» в xml-дереве.

[
['root', 1],
['dir', 2],
['book1',3],
['chapter1', 4],
['page1', 5],
['page2', 5],
['book2', 3],
['book3', 3],
['author', 3]
]

Ниже приведен xml, соответствующий приведенному выше списку.

<root>
  <dir>
    <book1>
      <chapter1>
        <page1 para=4>
        <page2 para=5>
      </chapter1>
    </book1>
    <book2 para=3/>
    <book3 para=3/>
    <author name=abc>
  </dir>
</root>

Проблема, с которой я столкнулся, заключается в том, что я не знаю, как отслеживать предыдущие узлы, чтобы новые узлы добавлялись в правильные родительские узлы?

Например:

следует добавить под

Итак, во время создания xml, после того, как получить/найти родительский узел, чтобы дочерний элемент был добавлен в нужное место?

Может ли кто-нибудь помочь мне написать общее решение этой проблемы?

13.12.2011

Ответы:


1

сохраните массив «lastforlevel», в котором хранится последний элемент, добавленный на данном уровне. Если вы попытаетесь создать элемент для уровня n, вам нужно добавить его к lastforlevel[n-1].

13.12.2011
  • Спасибо, я попробую. Просто общий вопрос. Каков обычный способ создания xml? Должны ли мы отслеживать каждый отдельный узел, чтобы дочерние узлы располагались в правильных позициях? ИЛИ Это зависит от формата плоских данных? 14.12.2011

  • 2

    У меня была такая же проблема на прошлой неделе. Вот мое решение

    http://www.yilmazhuseyin.com/blog/dev/convert-python-dict-xml/

    Основное различие между вашим подходом и моим заключается в том, что я использовал диктовки вместо списков.

    13.12.2011

    3

    Вот что я придумал:

    xml_arr = [
    ['root', 1],
    ['dir', 2],
    ['book1',3],
    ['chapter1', 4],
    ['page1', 5],
    ['page2', 5],
    ['book2', 3],
    ['book3', 3],
    ['author', 3]
    ]
    
    from xml.etree import ElementTree as etree
    
    root = xml_arr.pop(0)
    cur_level = root[1]
    root = etree.Element(root[0])
    cur_element = root
    parents = [root]
    
    for tag, level in xml_arr:
        while level < cur_level:
            cur_level -= 1
            parents.pop()
            cur_element = parents[-1]
        if level == cur_level:
            parents[-2].append(etree.Element(tag))
        if level > cur_level:
            cur_level = level
            new_elem = etree.Element(tag)
            cur_element.append(new_elem)
            parents.append(new_elem)
            cur_element = new_elem
    
    print etree.tostring(root)
    

    Это печатает:

    <root><dir><book1><chapter1><page1 /><page2 /></chapter1></book1><book2 /><book3 /><author /></dir></root>
    

    Или когда красиво напечатано:

    <root>
        <dir>
            <book1>
                <chapter1>
                    <page1/>
                    <page2/>
                </chapter1>
            </book1>
            <book2/>
            <book3/>
            <author/>
        </dir>
    </root>
    
    13.12.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..