【发布时间】:2014-06-05 14:10:45
【问题描述】:
我有一个巨大的测试数据,如下所示(是的,我无法控制这些数据)。每行实际上是 6 个部分,我需要根据这些数据生成一个 XML。
Nav;Basic;Dest;Smoke;No;Yes;
Nav;Dest;Recent;Regg;No;Yes;
Nav;Dest;Favourites;Regg;No;Yes;
...
Nav;Dest using on board;By POI;Smoke;No;Yes;
Nav;Dest using on board;Other;Regg;No;Yes;
每行的前 3 个元素表示“test suites"-XML element,最后 3 个元素应该创建一个 "test case"-XML element。
我已使用以下代码成功将其转换为 XML:
# testsuite (root)
testsuite = ET.Element('testsuite')
testsuite.set("name", "Tests")
def _create_testcase_tag(elem):
global testsuite
level1, level2, level3, elem4, elem5, elem6 = elem
# -- testsuite (level1)
testsuite_level1 = ET.SubElement(testsuite, "testsuite")
testsuite_level1.set("name", level1)
# -- testsuite (level2)
testsuite_level2 = ET.SubElement(testsuite_level1, "testsuite")
testsuite_level2.set("name", level2)
# -- testsuite (level3)
testsuite_level2 = ET.SubElement(testsuite_level2, "testsuite")
testsuite_level2.set("name", level3)
# -- testcase
testcase = ET.SubElement(testsuite_level2, "testcase")
testcase.set("name", "TBD")
summary = ET.SubElement(testcase, "summary")
summary.text = "Test Type= %s, Automated= %s, Available=%s" %(elem4, elem5, elem6)
with open(input_file) as in_file:
for line_number, a_line in enumerate(in_file):
try:
parameters = a_line.split(';')
if len(parameters) >= 6:
level1 = parameters[0].strip()
level2 = parameters[1].strip()
level3 = parameters[2].strip()
elem4 = parameters[3].strip()
elem5 = parameters[4].strip()
elem6 = parameters[5].strip()
lines_as_list.append((level1, level2, level3, elem4, elem5, elem6))
except ValueError:
pass
lines_as_list.sort()
for elem in lines_as_list:
_create_testcase_tag(elem)
output_xml = ET.ElementTree(testsuite)
ET.ElementTree.write(output_xml, output_file, xml_declaration=True, encoding="UTF-8")
上面的代码生成一个像这样的 XML:
<testsuite name="Tests">
<testsuite name="Nav">
<testsuite name="Basic navigation">
<testsuite name="Set destination">
<testcase name="TBD">
<summary>Test Type= Smoke test Automated= No, Available=Yes</summary>
</testcase>
</testsuite>
</testsuite>
</testsuite>
<testsuite name="Nav">
<testsuite name="Set destination">
<testsuite name="Recent">
<testcase name="TBD">
<summary>
Test Type= Reggression test Automated= No, Available=Yes
</summary>
</testcase>
</testsuite>
</testsuite>
</testsuite>
</testsuite>
...
这都是正确的,但是正如你所看到的,我为每一行创建了一整棵树,这不是我需要的。我需要结合例如所有具有相同名称的testsuite 合并为一个testsuite,并递归执行。
所以 XML 看起来像这样:
<testsuite name="Tests">
<testsuite name="Nav">
<testsuite name="Basic navigation">
<testsuite name="Set destination">
<testcase name="TBD">
<summary>Test Type= Smoke test Automated= No, Available=Yes</summary>
</testcase>
</testsuite>
<testsuite name="Recent">
<testcase name="TBD">
<summary>
Test Type= Reggression test Automated= No, Available=Yes
</summary>
</testcase>
</testsuite>
</testsuite>
</testsuite>
</testsuite>
我希望你能明白我的意思,但是level1、level2和level3应该是唯一的,里面有测试用例。
我应该怎么做?请不要建议使用任何外部库!我无法在客户站点中安装新库。 xml.etree.ElementTree 是我的全部。
谢谢
【问题讨论】:
-
我们为什么不建议外部库?看起来您已经在使用
lxml,这已经是一个非常繁重的外部库了。 -
我认为你需要在定义之上创建导航和基本导航。我的意思是 1 级和 2 级只创建一次休息保持不变。
-
@SlaterTyranus,请参阅编辑。我使用 xml.etree.ElementTree
-
确实期望第一行所有行都是 Nav;Dest;像这样
标签: python xml elementtree