解析和修改多个XML文件

2024-03-29 14:36:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力

  1. 从文件夹中读取多个XML文件
  2. 修改它们(删除两个标记的内容)
  3. 用新的XML文件替换旧的XML文件

这是我到目前为止得到的代码:

import xml.etree.ElementTree as ET
import glob

#parse xml files
filenames = glob.glob("[0-9][a-z](*).xml")

for filename in filenames:

    with open(filename, 'r', encoding="utf-8") as content:

        tree = ET.parse(content)

        lst_jugador = tree.findall('data/test')

        for jugador in lst_jugador:

             print (jugador.find('name').text, jugador.get("id"))


myroot = tree.getroot()

# remove tag content
for x in filenames:
     myroot = tree.getroot()
for x in myroot[1][2]:
    x.text = None
for x in myroot[1][17]:
    x.text = None
    filenames.write('data/new.xml')

我得到一个名称错误:未定义名称“tree”

有没有关于我做错了什么或如何以不同的方式做这件事的想法? 我可以用一个xml文件来实现这一点,我正在努力读写多个xml文件

这是读取和写入单个文件的代码的外观(工作正常):

import xml.etree.ElementTree as ET

mytree = ET.parse('data/test.xml')
myroot = mytree.getroot()

for x in myroot[1][2]:
    x.text = None
for x in myroot[1][17]:
    x.text = None
    mytree.write('data/new.xml')

这是我的xml文件的缩短版本:

    <xml_file>
    <tag>
        <tag_1>00000000</tag_1>
    </tag>
    <test>
        <one>
            <one_1>test</one_1>
            <one_2>test</one_2>
            <one_3>test</one_3>
            <one_4>test</one_4>
            <one_5>test</one_5>
            <one_6>test</one_6>
            <one_7>test</one_7>
            <one_8>test</one_8>
            <one_9>test</one_9>
            <one_10>test</one_10>
            <one_11>test</one_11>
            <one_12>test</one_12>
        </one>
        <two>
            <two_1>test</two_1>
            <two_2>test</two_2>
            <two_3>test</two_3>
            <two_4>test</two_4>
            <two_5>test</two_5>
            <two_6>test</two_6>
            <two_7>test</two_7>
            <two_8>test</two_8>
        </two>
    </test>
</xml_file>

Tags: 文件textintesttreefordatatag
2条回答

只需在定义的方法中概括您的工作过程,然后使用^{}迭代地将文件传递到函数中

import xml.etree.ElementTree as ET
import glob

# DEFINED METHOD RECEIVING FILE AS PARAMETER
def update_xml(xml_file)
    mytree = ET.parse(xml_file)
    myroot = mytree.getroot()

    for x in myroot[1][2]:
        x.text = None
    for x in myroot[1][17]:
        x.text = None

    mytree.write(xml_file)      # WRITE NEW TREE TO DISK
    return mytree               # RETURN NEW TREE IN FUNCTION


# ITERATIVELY UPDATE XML WITH map()
filenames = glob.glob("[0-9][a-z](*).xml")

new_trees = list(map(update_xml, filenames))

这是一个格式问题,您需要将“tree=ET.parse(content)”与“myroot=tree.getroot()”放在同一级别上

试试这个

import xml.etree.ElementTree as ET
import glob

#parse xml files
filenames = glob.glob("[0-9][a-z](*).xml")

for filename in filenames:

    with open(filename, 'r', encoding="utf-8") as content:

        tree = ET.parse(content)

        lst_jugador = tree.findall('data/test')

        for jugador in lst_jugador:

             print (jugador.find('name').text, jugador.get("id"))

tree = ET.parse(content)
myroot = tree.getroot()

# remove tag content
for x in filenames:
     myroot = tree.getroot()
for x in myroot[1][2]:
    x.text = None
for x in myroot[1][17]:
    x.text = None
    filenames.write('data/new.xml')

相关问题 更多 >