Python 解析和修改多个XML文件

Python 解析和修改多个XML文件,python,xml,xml-parsing,elementtree,xml.etree,Python,Xml,Xml Parsing,Elementtree,Xml.etree,我正在努力 从文件夹中读取多个XML文件 修改它们(删除两个标记的内容) 用新的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', enco

我正在努力

  • 从文件夹中读取多个XML文件
  • 修改它们(删除两个标记的内容)
  • 用新的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文件

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

    这是我的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>
    
    
    00000000
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    测试
    
    这是一个格式问题,您需要将“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')
    

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


    请在问题主体中发布示例XML和所需结果。这不起作用,我只得到:“NameError:名称‘内容’未定义”。谢谢,这非常有帮助!还有一个问题:我需要通过名称而不是位置来识别标签。所以我试着使用这个:
    mytree.find('.//标记名_1')。text='
    但是我得到了一个错误:AttributeError:'NoneType'对象没有属性“text”。就像你现在做的一样,首先用
    检查节点是否存在,如果
    ,然后分配
    text
    。或者使用
    findall
    进行迭代。
    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')
    
    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))