迭代列表以创建 XML 节点

问题描述 投票:0回答:1

我正在解析一个大型 XML 文件以创建 2 个列表(channelName 和 channelNum),并且这些列表的创建正在运行。
接下来我要做的是根据创建的列表创建一个新的、更小的 XML 文件,并为每组通道名称和通道编号创建一个单独的子节点 ()。

从下面的代码创建的列表(此处缩写)是:

channelName = ['Channel 01', 'Channel 02', 'Channel 03', 'FOX', 'NBC', 'Channel 04']
channelNum = ['1', '2', '3', '4', '5', '6']

我尝试过的代码是:

import xml.etree.ElementTree as ET

tree = ET.parse('svd_guide.xml')
root = tree.getroot()

ChannelName = []
ChannelNum = []

for child in root.findall('channel'):
    ChannelName.append(child.find('name').text)
    ChannelNum.append(child.find('logicalChannel').text)

def create_xml():
    channelroot = ET.Element("channels")
    child = ET.SubElement(channelroot, "channel")

    for name, num in zip(ChannelName, ChannelNum):
        ET.SubElement(child, "name").text = name
        ET.SubElement(child, "chan").text = num

    guidetree = ET.ElementTree(channelroot)

    guidetree.write("guide.xml", encoding = "utf-8", xml_declaration = True)    

create_xml()

我得到的结果是:

<?xml version='1.0' encoding='utf-8'?\>  
<channels>
    <channel>
        <name>Channel 01</name>
        <chan>1</chan>
        <name>Channel 02</name>
        <chan>2</chan>
        <name>Channel 03</name>
        <chan>3</chan>
        <name>FOX</name>
        <chan>4</chan>
        <name>NBC</name>
        <chan>5</chan>
        <name>Channel 04</name>
        <chan>6</chan>
   </channel>
</channels>

我希望得到的结果是:

<?xml version='1.0' encoding='utf-8'?\>  
<channels>
    <channel>
        <name>Channel 01</name>
        <chan>1</chan>
    </channel>
    <channel>
        <name>Channel 02</name>
        <chan>2</chan>
    </channel>
    <channel>
        <name>Channel 03</name>
        <chan>3</chan>
    </channel>
    <channel>
        <name>FOX</name>
        <chan>4</chan>
    </channel>
    <channel>
        <name>NBC</name>
        <chan>5</chan>
    </channel>
    <channel>
        <name>Channel 04</name>
        <chan>6</chan>
   </channel>
python-3.x xml nested-lists
1个回答
0
投票

您只需将

child = ET.SubElement(channelroot, "channel")
移动到 for 循环内部,因为您想要/需要多次创建
channel

我更改了其他一些部分,因为我没有

svd_guide.xml
,所以我在
ChannelName
ChannelNum
上使用了init。

import xml.etree.ElementTree as ET

#tree = ET.parse('svd_guide.xml')
#root = tree.getroot()

ChannelName = ['Channel 01', 'Channel 02', 'Channel 03', 'FOX', 'NBC', 'Channel 04']
ChannelNum = ['1', '2', '3', '4', '5', '6']

#for child in root.findall('channel'):
#    ChannelName.append(child.find('name').text)
#    ChannelNum.append(child.find('logicalChannel').text)

def create_xml():
    channelroot = ET.Element("channels")
    #child = ET.SubElement(channelroot, "channel")

    for name, num in zip(ChannelName, ChannelNum):
        child = ET.SubElement(channelroot, "channel")
        ET.SubElement(child, "name").text = name
        ET.SubElement(child, "chan").text = num
        

    guidetree = ET.ElementTree(channelroot)

    guidetree.write("guide.xml", encoding = "utf-8", xml_declaration = True)    

create_xml()

输出(

guide.xml
):

<?xml version='1.0' encoding='utf-8'?>
<channels>
    <channel/>
    <channel>
        <name>Channel 01</name>
        <chan>1</chan>
    </channel>
    <channel>
        <name>Channel 02</name>
        <chan>2</chan>
    </channel>
    <channel>
        <name>Channel 03</name>
        <chan>3</chan>
    </channel>
    <channel>
        <name>FOX</name>
        <chan>4</chan>
    </channel>
    <channel>
        <name>NBC</name>
        <chan>5</chan>
    </channel>
    <channel>
        <name>Channel 04</name>
        <chan>6</chan>
    </channel>
</channels>
© www.soinside.com 2019 - 2024. All rights reserved.