【问题标题】:How to move everything inside a xml tag to a new xml file using python?如何使用 python 将 xml 标签内的所有内容移动到新的 xml 文件中?
【发布时间】:2021-09-14 03:49:05
【问题描述】:

我有一个 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) 

【问题讨论】:

    标签: python xml xml-parsing elementtree


    【解决方案1】:

    让我们从源 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')
    

    【讨论】:

    • 如何为多个文件执行此操作?哦,顺便说一句,这是可行的。谢谢
    • 编写一个循环遍历您的输入文件。这个循环应该包括: 1. 解析当前文件。 2.删除“不需要的”元素。 3. 使用从当前输入文件派生的名称将树保存回同一文件或输出文件。
    • 你可以把你的想法放在上面提到的代码中吗?
    • 感谢您的详细回答。我传递了一个文件名 myDrop("Input"),上面的代码将处理后的 xml 文件保存为一个新的 xml 文件,即 input_out.xml。但我有一个包含 50 多个 xml 文件的文件夹。我如何通过它们?我试图遍历文件,但它不起作用。任何想法我们怎么能做到这一点?
    • 您应该遍历包含源文件的目录。但是如果这个目录不是你的默认目录,那么你可能也应该传递目录名。还要注意传递文件 name(不带点和扩展名),而不是文件对象本身。
    猜你喜欢
    • 2021-09-16
    • 2014-06-19
    • 2021-01-28
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多