首页 > 解决方案 > 如何将 DOCTYPE 添加到已经存在的元素树的第二行?

问题描述

我有创建 XML 的代码,但我需要文件第二行的 DOCTYPE 标头。我看到每个人都为此使用 lxml,但我已经在使用xml.etree.ElementTree. 我可以在同一棵树上的同一文件中使用两者吗?这是我的代码:

import xml.etree.ElementTree as ET  
from lxml import etree


global num_of_parallel_tests

num_of_parallel_tests = 5
  
  
def GenerateXML(fileName) : 
      
    root = ET.Element("suite") 
    root.set("thread-count", str(num_of_parallel_tests))
    root.set("name", "Selenium Automated Test w/ TestNG")
    root.set("parallel", "tests")

    for x in range(1, num_of_parallel_tests + 1):
        test = ET.Element("test")
        test.set("name", "Testing Row " + str(x))
        parameter = ET.SubElement(test, "parameter")
        parameter.set("name", "Row")
        parameter.set("value", str(x))
        classes = ET.SubElement(test, "classes")
        a_class = ET.SubElement(classes, "class")
        a_class.set("name", "RealPackage.ParallelTests")


        root.append(test)
      

      
    tree = ET.ElementTree(root) 

    


      
    with open (fileName, "wb") as files : 
        tree.write(files) 
  
# Driver Code 
if __name__ == "__main__":  
    GenerateXML("GeneratedXML.xml") 

它产生这个输出:

<?xml version="1.0"?>

-<suite parallel="tests" name="Selenium Automated Test w/ TestNG" thread-count="5">


-<test name="Testing Row 1">

<parameter name="Row" value="1"/>


-<classes>

<class name="RealPackage.ParallelTests"/>

</classes>

</test>


-<test name="Testing Row 2">

<parameter name="Row" value="2"/>


-<classes>

<class name="RealPackage.ParallelTests"/>

</classes>

</test>


-<test name="Testing Row 3">

<parameter name="Row" value="3"/>


-<classes>

<class name="RealPackage.ParallelTests"/>

</classes>

</test>


-<test name="Testing Row 4">

<parameter name="Row" value="4"/>


-<classes>

<class name="RealPackage.ParallelTests"/>

</classes>

</test>


-<test name="Testing Row 5">

<parameter name="Row" value="5"/>


-<classes>

<class name="RealPackage.ParallelTests"/>

</classes>

</test>

</suite>

但我需要这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite thread-count="5" name="BlogSuite" parallel="tests">
<test name="Test 1">
<parameter name="Row" value="1"/>
    <classes>
      <class name="RealPackage.ParallelTests"/>
    </classes>
  </test> 
  <test name="Test 2">
<parameter name="Row" value="2"/>
    <classes>
      <class name="RealPackage.ParallelTests"/>
    </classes>
  </test> 
    <test name="Test 3">
<parameter name="Row" value="3"/>
    <classes>
      <class name="RealPackage.ParallelTests"/>
    </classes>
  </test> 
    <test name="Test 4">
<parameter name="Row" value="4"/>
    <classes>
      <class name="RealPackage.ParallelTests"/>
    </classes>
  </test> 
      <test name="Test 5">
<parameter name="Row" value="5"/>
    <classes>
      <class name="RealPackage.ParallelTests"/>
    </classes>
  </test>
  </suite>

注意前两行是不同的。

标签: pythonxmllxmlelementtree

解决方案


原来我只需要这条线: tree.write(files, encoding="utf-8", xml_declaration=True, doctype='<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">')


推荐阅读