使用PHP删除父DOM元素


Remove parent DOM element with PHP

当externald(testcase的子元素)为<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();
?>

这里有什么问题?为什么我的代码没有删除外部id<1000?即使是选择父元素的方法也不适用于我(parentNode)。

欢迎任何帮助。

DOMNode::getElementsByTagName()返回实时结果。如果删除节点,列表实际上会发生更改。您可能想要签出DOMXpath::evaluate()。结果是无效的,您可以在Xpath表达式中使用条件。

$xpath = new DOMXpath($dom);
foreach ($xpath->evaluate('//testcase[externalid < 1000]') as $testCase) {
  $testCase->parentNode->removeChild($testCase);
}