当externalid(testcase的子元素)为<时,我想从.xml文件中删除元素(testcases)。 1000。
测试用例总是在测试中。可以有多个级别的测试套件。 所以这是我的.xml:
<?xml version="1.0" encoding="UTF-8"?>
<testsuite id="" name="" >
<node_order><![CDATA[]]></node_order>
<details><![CDATA[]]></details>
<testsuite id="14162" name="Suite1" >
<node_order><![CDATA[0]]></node_order>
<details><![CDATA[]]></details>
<testsuite id="14037" name="Child Suite 1" >
<node_order><![CDATA[1]]></node_order>
<details><![CDATA[]]></details>
<testcase internalid="14038" name="Testcase 1">
<node_order><![CDATA[0]]></node_order>
<externalid><![CDATA[790]]></externalid> <---EXTERNAL ID
<version><![CDATA[1]]></version>
<steps>
<step>
<step_number><![CDATA[1]]></step_number>
<actions><![CDATA[<p>Text</p>]]></actions>
<expectedresults><![CDATA[<p>Text</p>
<p>Text</p>]]></expectedresults>
<execution_type><![CDATA[1]]></execution_type>
</step>
</steps>
</testcase>
<testcase internalid="14040" name="Testcase 2">
<node_order><![CDATA[0]]></node_order>
<externalid><![CDATA[791]]></externalid> <---EXTERNAL ID
<version><![CDATA[1]]></version>
<steps>
<step>
<step_number><![CDATA[1]]></step_number>
<actions><![CDATA[<p>Text</p>]]></actions>
<expectedresults><![CDATA[<p>Text</p>
<p>Text</p>]]></expectedresults>
<execution_type><![CDATA[1]]></execution_type>
</step>
</steps>
</testcase>
</testsuite>
<testcase internalid="14042" name="Testcase 3">
<node_order><![CDATA[0]]></node_order>
<externalid><![CDATA[792]]></externalid> <---EXTERNAL ID
<version><![CDATA[1]]></version>
<steps>
<step>
<step_number><![CDATA[1]]></step_number>
<actions><![CDATA[<p>Text</p>]]></actions>
<expectedresults><![CDATA[<p>Text</p>
<p>Text</p>]]></expectedresults>
<execution_type><![CDATA[1]]></execution_type>
</step>
</steps>
</testcase>
</testsuite>
</testsuite>
这是我的PHP代码,不会删除测试用例。
<?php
$number = 1000;
$dom = new DOMDocument('1.0');
$dom->load('tc.xml');
$testcases = $dom->getElementsByTagName('testcase');
foreach($testcases as $tckey=>$tc)
{
$externalID = $tc->childNodes->item(3)->textContent;
if($externalID > 0 && $externalID <= $number)
{
unset($tc);
//$tc->parentNode->removeChild($tc);
//$tc->childNodes->item(3)->parentNode->removeChild($tc);
}
}
echo $dom->saveXML();
?>
这是什么问题?为什么我的代码不会删除外部标识<1000的测试用例?即使是选择父元素的方法也不适用于我(parentNode)。
欢迎任何帮助。
答案 0 :(得分:1)
DOMNode::getElementsByTagName()
会返回实时结果。如果删除节点,列表实际上会更改。您可能需要查看DOMXpath::evaluate()
。结果不是实时的,您可以在Xpath表达式中使用条件。
$xpath = new DOMXpath($dom);
foreach ($xpath->evaluate('//testcase[externalid < 1000]') as $testCase) {
$testCase->parentNode->removeChild($testCase);
}