【问题标题】:xml.etree - insert element as a child at specific elementxml.etree - 在特定元素处插入元素作为子元素
【发布时间】:2021-12-11 20:52:29
【问题描述】:

我有一个文件,其中包含一些 .txt 格式的原始数据,我需要将数据输入到结构更清晰的 .xml 文档中。在 Python 中。我的源文件大约有 10000 行,但为了方便起见,我只附上了包含三个短列表(“ID”、“名称”和“父 ID”)的代码。

原始 .txt 如下所示:

Ac  Value 1
Ac_05   Value 2 Ac
Ac_05_00    Value 3 Ac_05
Ac_15   Value 4 Ac_05

如果元素有一个父 ID(我的代码中称为 pID 的列表),那么它应该是一个元素的子元素,该元素的 ID 与子元素的父 ID 相同...希望有意义。

我已经得到了以下代码:

import xml.etree.cElementTree as ET

IDs = ['Ac', 'Ac_05', 'Ac_05_00', 'Ac_15']
Names = ['Value 1', 'Value 2', 'Value 3', 'Value 4']
pID = ['', 'Ac', 'Ac_05', 'Ac']

# make xml file
Items = ET.Element('Items')

for i in range(len(IDs)):

    if pID[i] in IDs:

        # index of the parent ID
        # IDs.index(pID[i])

        # value of the parent ID
        # IDs[IDs.index(pID[i])]
       
        Item = ET.SubElement(Children, 'Item')

        ID = ET.SubElement(Item, 'ID')
        ID.text = IDs[i]

        Name = ET.SubElement(Item, 'Name')
        Name.text = Names[i]

        Children = ET.SubElement(Item, 'Children')

    else:
        Item = ET.SubElement(Items, 'Item')
            
        ID = ET.SubElement(Item, 'ID')
        ID.text = IDs[i]

        Name = ET.SubElement(Item, 'Name')
        Name.text = Names[i]

        Children = ET.SubElement(Item, 'Children')

tree = ET.ElementTree(Items)
ET.indent(tree, space='\t', level=0)
tree.write('filename.xml', encoding='utf-8')

我不知道如何将子元素附加到 .xml 中的特定元素。例如,ID 为“AC_15”的最后一项应该是“AC”的子项。 .xml 中的正确输出应如下所示:

<Items>
    <Item>
        <ID>Ac</ID>
        <Name>Value 1</Name>
        <Children>
            <Item>
                <ID>Ac_05</ID>
                <Name>Value 2</Name>
                <Children>
                    <Item>
                        <ID>Ac_05_00</ID>
                        <Name>Value 3</Name>
                        <Children/>                         
                    </Item>
                </Children>
            </Item>
            <Item>
                <ID>Ac_15</ID>
                <Name>Value 4</Name>
                <Children/>
            </Item>
        </Children>
    </Item>
</Items>

有人对像我这样的 Python 初学者有什么建议吗?

【问题讨论】:

    标签: python xml.etree


    【解决方案1】:

    尽管对 if 部分的更改很小,但您还有一个大问题,因此您应该专注于真正的差异。这里真正的区别只是项目的父元素

    我做了一个字典来存储所有父元素的子标签,应该没问题。至少它可以按预期适用于您的示例

    Items = ET.Element('Items')
    elems=dict()
    for id_, name, pid in zip(IDs, Names, pID):
        el=ET.Element('Item')
        ET.SubElement(el, 'ID').text = id_
        ET.SubElement(el, 'Name').text = name
        elems[id_]=ET.SubElement(el, 'Children')
        
        if not pid:
            parent=Items
        else:
            parent=elems[pid]
        parent.append(el)
    

    【讨论】:

      猜你喜欢
      • 2022-10-17
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多