【问题标题】:Python xml creation from list with element levels从具有元素级别的列表创建 Python xml
【发布时间】:2011-12-13 20:55:54
【问题描述】:

这是我第一次使用 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 的过程中,如何获取/查找父节点,以便将子节点添加到正确的位置?

谁能指导我为这个问题写一个通用的解决方案?

【问题讨论】:

    标签: python xml list


    【解决方案1】:

    保留一个“lastforlevel”数组,该数组存储在给定级别附加的最后一项。如果您尝试为第 n 级创建元素,则需要将其附加到 lastforlevel[n-1]

    【讨论】:

    • 谢谢,我会试试的。只是一个普遍的问题。创建xml的常用方法是什么?我们是否必须跟踪每个节点,以便将子节点放置在正确的位置?或者这取决于平面数据的格式?
    【解决方案2】:

    上周我遇到了同样的问题。这是我的解决方案

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

    你的方法和我的方法的基本区别是我使用的是字典而不是列表

    【讨论】:

      【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多