python - 如何使用 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)
解决方案
让我们从源 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>
多个输入文件案例
如果您有多个文件要以这种方式处理,您应该:
- 编写一个循环遍历源文件。
- 取当前输入文件的名称,不带扩展名。
- 调用一个函数,该函数接受文件名,解析输入文件,删除“不需要的”元素,并将“简化”的 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')
推荐阅读
- flutter - 如何实现 ViewPage onTouch?
- python - string.isalpha() 在自定义 django 验证器下返回 False,无论字符串是否包含数字
- robotframework - RobotFrameWork:如何从一个页面获取文本并在另一个页面中输入文本?
- c# - 如何在 C# 中连接到 RavenHQ
- salesforce - 为什么我不能有两种页面格式到一个记录类型?
- python - ImportError:无法在虚拟环境中导入名称 main
- excel - 如何在 Excel 中复制单元格?
- r - 如何使用预测变量和响应变量运行逻辑回归?
- python - 如何在 Python 中对版本标签列表进行排序
- javascript - 将在 Javascript 中捕获具有异常的组的正则表达式