首页 > 解决方案 > 如何使用 python 将 xml 标签内的所有内容移动到新的 xml 文件中?

问题描述

我有一个 xml 文件 input.xml

<?xml version="1.0"?>
<TestSuite Name="DM123">
  <Group Name="TestRoot" ExecutionPolicy="AnyDeviceAnyOrder">
  <Parameters>
      <Parameter Type="Integer" Name="maxA" Value="1" />
      <Parameter Type="Integer" Name="MaxB" Value="120" />
      <Parameter Type="String" Name="MaxC" Value="master" />
  </Parameters> 
  <Children>
          <Test Name="TestCam" Namespace="TestCase">
              <Parameters>
                    <Parameter Type="Integer" Name="maxA" />
                    <Parameter Type="Integer" Name="MaxB" />
                    <Parameter Type="String" Name="MaxC" />
              </Parameters>
          </Test>
  </Children>      
  </Group>
  <Models>
      <Model Name= "NewPhone"> 
  </Models>
</TestSuite>

我想移动一个新的 xml 文件中的所有内容,包括组名以及带有组名但没有子标签的行。所以基本上所有的东西,除了没有子标签到一个新的 xml 文件中。

所需的输出.xml:

<?xml version="1.0"?>
<TestSuite Name="DM123">
  <Group Name="TestRoot" ExecutionPolicy="AnyDeviceAnyOrder">
  <Parameters>
      <Parameter Type="Integer" Name="maxA" Value="1" />
      <Parameter Type="Integer" Name="MaxB" Value="120" />
      <Parameter Type="String" Name="MaxC" Value="master" />
  </Parameters>     
  </Group>
  <Models>
      <Model Name= "NewPhone"> 
  </Models>
</TestSuite>

我是 python 新手,所以我做了一些基本的编程,只打印子标签和子属性。不知道如何才能达到上述期望的输出。任何帮助都会很棒。提前致谢

仅供参考 - 我有多个相同类型的文件,所以如果我可以放置一个函数来获取每个文件并移动除子标签之外的所有内容,那就太好了。

代码:

import pandas
import xml.etree.ElementTree as ET
import io
from collections import defaultdict
from io import BytesIO

xmlDocument = open("input.xml", 'r').read() 
tree = ET.parse('input.xml')
root = tree.getroot()  

for child in root:
print(child.tag, child.attrib) 

for parameter in root.findall('Group'):
print(parameter.attrib) 

标签: pythonxmlxml-parsingelementtree

解决方案


让我们从源 XML 中的更正开始: 模型元素应该是“关闭的”,所以在终止符“>”之前添加“/”,这样它就可以写成:

<Model Name= "NewPhone"/> 

要读取源 XML,只需调用:

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

不需要 xmlDocument = open(...))。

现在,就主要任务而言,我发现您实际上需要删除Group元素中包含的每个Children元素。

为此,请运行:

for grp in root.findall('Group'):
    ch = grp.find('Children')
    grp.remove(ch)

现在,当您打印“简化”的 XML 树时:

print(ET.tostring(root, encoding='unicode', short_empty_elements=True))

你会得到:

<TestSuite Name="DM123">
    <Group Name="TestRoot" ExecutionPolicy="AnyDeviceAnyOrder">
        <Parameters>
            <Parameter Type="Integer" Name="maxA" Value="1" />
            <Parameter Type="Integer" Name="MaxB" Value="120" />
            <Parameter Type="String" Name="MaxC" Value="master" />
        </Parameters> 
        </Group>
    <Models>
        <Model Name="NewPhone" /> 
    </Models>
</TestSuite>

多个输入文件案例

如果您有多个文件要以这种方式处理,您应该:

  1. 编写一个循环遍历源文件。
  2. 取当前输入文件的名称,不带扩展名。
  3. 调用一个函数,该函数接受文件名,解析输入文件,删除“不需要的”元素,并将“简化”的 XML 树保存在输出文件中,该名称源自当前输入文件。

这种函数的一个例子可以是:

def myDrop(fn):
    tree = ET.parse(fn + '.xml')
    root = tree.getroot()
    for grp in root.findall('Group'):
        ch = grp.find('Children')
        grp.remove(ch)
    with open(fn + '_out.xml', 'w') as f:
        tree.write(f, encoding='unicode')

推荐阅读