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

2024-06-28 14:53:06 发布

您现在位置: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标记的行。因此,基本上,除了子标记之外,所有内容都会被添加到一个新的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新手,所以我做了一些基本编程,只打印子标记和子属性。不知道如何才能达到上述期望的输出。任何帮助都会很棒。提前谢谢

仅供参考-我有多个相同类型的文件,所以如果我可以放置一个函数,该函数可以获取每个文件并移动除子标签以外的所有内容,那将是非常棒的

代码:

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) 

Tags: 文件nameimportinputparametervaluemodelstype
1条回答
网友
1楼 · 发布于 2024-06-28 14:53:06

让我们从源XML中的一个更正开始: Model元素应为“closed”,因此在“>;”之前添加“/”, 因此,它被写为:

<Model Name= "NewPhone"/> 

要读取源XML,只需调用:

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

xmlDocument=open(…)不需要)

现在,就主要任务而言,我看到你实际上 需要删除元素中包含的每个元素

要执行此操作,请运行:

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

相关问题 更多 >