如何将 DOCTYPE 添加到已存在的元素树的第二行?
How to add DOCTYPE to the second line of an already existing element tree?
我有创建 XML 的代码,但我需要文件第二行的 DOCTYPE header。我看到每个人都为此使用 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>
注意前两行是不同的。
结果我只需要这一行:
tree.write(files, encoding="utf-8", xml_declaration=True, doctype='<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">')
我有创建 XML 的代码,但我需要文件第二行的 DOCTYPE header。我看到每个人都为此使用 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>
注意前两行是不同的。
结果我只需要这一行:
tree.write(files, encoding="utf-8", xml_declaration=True, doctype='<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">')