【发布时间】:2021-09-16 06:03:26
【问题描述】:
我有多个类似于以下的 xml 文件:- 名称 = 更新的 input.xml
<?xml version="1.0"?>
<TestSuite Name="A123">
<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="maxTooth" />
</Parameters>
</Test>
</Children>
<Group Name="TestMain" 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 Name="TestMain1" 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="TestDriver1" Namespace="TestCase">
<Parameters>
<Parameter Type="Integer" Name="maxP" />
</Parameters>
</Test>
</Children>
</Group>
<Children>
<Test Name="TestDriver" Namespace="TestCase">
<Parameters>
<Parameter Type="Integer" Name="maxP" />
</Parameters>
</Test>
<Test Name="TestField" Namespace="TestCase">
<Parameters>
<Parameter Type="Integer" Name="maxP" />
<Requirements>
<Requirement TypeId = "Abcdef" Source = "User1" >
<Requirement TypeId = "ghijk" Source = "User1" >
</Requirements>
</Parameters>
</Test>
</Children>
</Group>
</Group>
<Models>
<Model Name= "NewPhone">
</Models>
</TestSuite>
我有一个 python 代码,它正在创建一个新的 xml 文件,其中只有一些标签,如下所示 file1_sorted.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>
所以基本上它删除了子标签。代码如下:-
import os
import xml.etree.ElementTree as ET
def removeChild(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 + '_sorted.xml', 'w') as f:
tree.write(f, encoding='unicode')
path = r"C:\Users\xml_files"
for filename in os.listdir(path):
if filename.endswith(".xml"):
fname = os.path.splitext(filename)[0]
print(fname)
removeChild(fname)
现在我要做的是将 Test 标记移动到子标记内,但没有重复的参数。正如您在文件 input.xml 中看到的,有一个子组 TestMain,其中包含与父组 TestRoot 相同的参数。我想删除子组及其参数,而不是测试标签。
像这样的 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>
<Children>
<Test Name="TestCam" Namespace="TestCase">
<Parameters>
<Parameter Type="Integer" Name="maxTooth" />
</Parameters>
</Test>
<Test Name="TestDriver" Namespace="TestCase">
<Parameters>
<Parameter Type="Integer" Name="maxP" />
</Parameters>
</Test>
<Test Name="TestField" Namespace="TestCase">
<Parameters>
<Parameter Type="Integer" Name="maxP" />
<Requirements>
<Requirement TypeId = "Abcdef" Source = "User1" >
<Requirement TypeId = "ghijk" Source = "User1" >
</Requirements>
</Parameters>
</Test>
</Children>
</Group>
<Models>
<Model Name= "NewPhone">
</Models>
</TestSuite>
我怎样才能实现这个期望的 output.xml?提前致谢
【问题讨论】:
-
对于多步 XML 更改,请考虑 XSLT,您可以使用 Python 的第三方模块
lxml运行它。见demo -
我没听懂。
-
免费到
pip install!或者,您可以使用您系统上可能已有的外部XSLT processors:Windows 的System.Xml.Xsl或Unix 的(Mac/Linux)xsltproc。 -
但是我如何在 python 脚本中使用它呢?
-
使用Python的
subprocess.Popen调用外部程序。
标签: python xml parsing xml-parsing elementtree