如何使用 python 将 xml 标签内的所有内容移动到新的 xml 文件?

How to move everything inside a xml tag to a new xml file using python?

我有一个 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 文件中的所有内容,包括组名以及带有组名但没有 children 标记的行。所以基本上除了 children 标签之外的所有内容都放入新的 xml 文件中。

想要Output.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 的新手,所以我做了一些基本的编程,只打印 child 标签和 child 属性。不知道如何才能实现上述所需的输出。任何帮助都会很棒。提前致谢

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

代码:

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) 

让我们从源代码中的更正开始 XML: Model 元素应该是“封闭的”,所以在终止的“>”之前添加“/”, 所以它写成:

<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')