如何使用 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>
多输入文件情况
如果您有多个 个文件要以这种方式处理,您应该:
- 编写一个遍历源文件的循环。
- 取当前输入文件的名称,不带扩展名。
- 调用接受文件名的函数,解析输入文件,
删除“不需要的”元素并在输出中保存“减少的”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')
我有一个 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>
多输入文件情况
如果您有多个 个文件要以这种方式处理,您应该:
- 编写一个遍历源文件的循环。
- 取当前输入文件的名称,不带扩展名。
- 调用接受文件名的函数,解析输入文件, 删除“不需要的”元素并在输出中保存“减少的”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')