【问题标题】:creating dynamic nested xml from Excel从 Excel 创建动态嵌套 xml
【发布时间】:2020-01-05 09:07:10
【问题描述】:

我正在尝试将 Excel 转换为嵌套 XML,但未能按预期成功。

这是我的代码。

import openpyxl
import xml.etree.ElementTree as etree

# reading data from the source, xls
wb1 = openpyxl.load_workbook(filename='C:\GSH\parent_child.xlsx')
ws1 = wb1.get_sheet_by_name('Sheet1')
row_max = ws1.max_row

# creating xml tree structure
root = etree.Element('Hierarchy')

# iterating through the xls and creating children based on the condition
for row_values in range(2, row_max+1):
    parent = etree.SubElement(root, 'parent')
    parent.text = ws1.cell(column=1, row=row_values).value
    root.append(parent)
    if (ws1.cell(column=1, row = row_values).value == ws1.cell(column=2, row = row_values-1).value):
        print("------Inside if condition")
        print(ws1.cell(column=2, row=row_values).value)
        child = etree.SubElement(parent, 'child')
        child.text = ws1.cell(column=2, row=row_values).value
        parent.append(child)
        print("-------Inside if condition")
    tree = etree.ElementTree(root)

tree.write('C:\GSH\gsh.xml')

我得到这样的 XML..

但是,我的 XML 应该是这样的。

任何建议,请。

以上是我正在处理的源 XLS。

【问题讨论】:

    标签: python excel xml


    【解决方案1】:

    您可以设置变量名称而不是父子节点。此代码只是您列表的一部分,看起来很棘手,但工作正常。 d[child[i]].text = " " 只是显示标签的两边。用字典制作var in loop,请参考this

    import xml.etree.ElementTree as ET
    
    India = ET.Element('India')  # set root
    parent = ['India', 'Telangana', 'Telangana', 'Telangana','Nalgonda']  # parent list
    child = ['Telangana', 'Cyberabad', 'Warangal','Nalgonda','BusStation']  # child list
    
    d = {}  # use dictionary to define var in loop
    d['India'] = India
    
    for i in range(len(child)):
    
        for k, v in d.items():
            if k == parent[i]:
                pa = v
                break
    
        d[child[i]] = ET.SubElement(pa, child[i])
        d[child[i]].text = " "  # to get both side of tags
    
    tree = ET.ElementTree(India)
    tree.write('gsh.xml')
    
    # <India>
    # <Telangana>
    # <Cyberabad> </Cyberabad>
    # <Warangal> </Warangal>
    # <Nalgonda>
    # <BusStation> </BusStation>
    # </Nalgonda>
    # </Telangana>
    # </India>
    

    【讨论】:

    • 非常感谢,你拯救了我的一天..我们可以在标签之外获取值,而不是在里面吗?我的意思不是 ,我仍在努力获得 NelloreChittoor
    • 我已经更新了原始问题中的 xls 源代码。
    • 我看不出你的最终结果是什么。在我的示例代码中,varname 是 str(varname)。使用 .text 将字符串放在标签内。请尝试。
    • 我已经更新了最终结果的答案,看起来应该是这样的。我正在尝试您的建议并随时通知您..
    • 我认为你已经大大改变了问题和预期的答案。不过,您可以通过扩展我的代码来完成。恐怕我不会再这样做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多