使用Python将XML合并到父XML文件中

3

我已经在stackoverflow上找到了几个使用Python合并XML的示例,但是我想将两个测试用例XML合并成一个父级XML。

这是我的父级XML (main.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE propertiesconfiguration_my_campaign>
<exconfig>
  <manager master_node="themaster">
    <testspecif class="MySpec" name="MY_TEST">
      <report>
        *** Report Attributes in here ***
      </report>
        *** Looking to post Test Cases in here ***
    </testspecif>
  </manager>
</exconfig>

我在上面的XML中标记了我要发布以下测试用例XML的位置; 它们如下所示。
(first.xml)
  <testcase class="CTestCase000001a" name="TC-000001a">
    *** Test case Attributes in here ***
  </testcase>

(second.xml)

  <testcase class="CTestCase000001b" name="TC-000001b">
    *** Test case Attributes in here ***
  </testcase>

这是我用来合并XML文件的代码,但是该代码只是简单地将first.xml和second.xml文件的文本内容倒在main.xml文件的底部。

from xml.etree import ElementTree as et

def combine(files):
    first = None
    for filename in files:
        data = et.parse(filename).getroot()
        if first is None:
            first = data
        else:
            first.extend(data)
    if first is not None:
        f = open('C:/temp/newXML.xml', 'wb')
        f.write(et.tostring(first))
        f.close()
        # return et.tostring(first)

combine(('C:/main.xml','C:/first.xml','C:/second.xml'))

我希望输出的内容类似于这样,将所有测试用例XML文本嵌入到testspecelement中的报告节点中:
<!DOCTYPE propertiesconfiguration_my_campaign>
<exconfig>
  <manager master_node="themaster">
    <testspecif class="MySpec" name="MY_TEST">
      <report>
        *** Report Attributes in here ***
      </report>
      <testcase class="CTestCase000001a" name="TC-000001a">
        *** Test case Attributes in here ***
      </testcase>  
      <testcase class="CTestCase000001b" name="TC-000001b">
        *** Test case Attributes in here ***
      </testcase>       
    </testspecif>
  </manager>
</exconfig>

任何帮助都将不胜感激。谢谢,MikG。

原始报告发生了什么? - Padraic Cunningham
我删除了报告属性,因为它包含了几个项目,会使帖子变得混乱,而且这些属性与最终目标并不相关。我保留了报告元素,以防有一些参考可以帮助定位测试用例元素。 - MikG
你只是在问是否要将标签附加到testspecif节点吗? - Padraic Cunningham
嗨,那就是计划,我尝试将测试规范节点添加到我的测试用例文件中,然后合并,但没有成功。这是我第一次尝试编辑XML,所以如果有什么明显的错误,我很抱歉。 - MikG
第一个和第二个 XML 文件也有多个标签,对吗? - Padraic Cunningham
是的,在first.xml和second.xml中有一些标签和属性,但我不想让问题变得混乱,所以省略了这些标签。基本上,我希望获取<testcase>节点及其内部所有标签和属性,并将其放入main.xml文件中的“testspecif”节点中。 - MikG
1个回答

4
from xml.etree import ElementTree as et


c1, c2 = et.parse("c1.xml"), et.parse("c2.xml")

par_xml = et.parse("par.xml")

test = par_xml.find(".//testspecif")

test.extend([c1.find(".//testcase"), c2.find(".//testcase")])

print(et.tostring(par_xml.getroot()))
# par.write("par.xml",encoding="utf-8", xml_declaration=True)

使用您的示例输入,将会得到以下结果:

<exconfig>
  <manager master_node="themaster">
    <testspecif class="MySpec" name="MY_TEST">
      <report>

      </report>

    <testcase class="CTestCase000001a" name="TC-000001a">
    *** Test case Attributes in here ***
</testcase>
   <testcase class="CTestCase000001b" name="TC-000001b">
    *** Test case Attributes in here ***
  </testcase>
</testspecif>
  </manager>
</exconfig>

感谢提供示例,再次强调一下,我希望在报告节点之外但在测试规范节点内发布(基本上与报告节点处于同一层次结构),那么我只需省略报告代码行并将其发布到test.append中吗? - MikG
是的,抱歉我不知道为什么一直以为你想要将内容附加到报告标记,编辑将在您所需的两个节点中添加。 - Padraic Cunningham
谢谢Padraic,你的解决方案看起来可行,我只是在第二个测试用例中遇到了一个制表符长度的问题(由于某种原因,它似乎是缩进的,但比第一个测试用例多了两个空格)。但是使用XML时,只要前一个测试用例以</testcase>结尾,这不是一个大问题吗?也许我的XML文件需要检查制表符结构。 - MikG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接