0

我有一个非常奇怪的错误,我正试图弄清楚。我加载一个 xml,找到一个特定的节点,然后删除它,然后保存文件。但是当我运行它时,它只在第一次运行时捕获其中一些节点,然后在第二次和第三次运行时捕获更多节点,直到它最终完成。我没有理由弄清楚为什么会发生这种情况。这是我的代码:

foreach(glob("*.xml") as $filename) {
$domsrc = file_get_contents($filename, FILE_TEXT);
$MYdom = new DomDocument();
$MYdom->loadXML($domsrc);

foreach ($MYdom->getElementsByTagName('URL') as $virttour) {
    if($virttour->getAttribute('Type') == 'Virtual Tour') {
$virttour->parentNode->removeChild($virttour); 
   }
}
$MYdom->save($filename);
4

2 回答 2

0

您的第一段代码不起作用的原因是节点列表或 $MYdom->getElementsByTagName('URL') 创建的列表是动态的。这意味着当您删除元素时,它会更改节点的长度及其位置。foreach 语句最终会跳过元素,因为它们的位置已经改变。完成原始语句的最佳方法是使用考虑到这一点的 for 语句:

$nodes = $MYdom->getElementsByTagName('URL')

for ($i = 0; $i < $nodes->length; $i++) {
                  $node = $nodes->item($i);
                  $node->parentNode->removeChild($node);
                  $i--;
                }

或 while 语句:

while($nodes->length) {
                  $node = $FlavorNodes->item(0);
                  $node->parentNode->removeChild($node);
                }
于 2013-10-08T23:01:38.230 回答
0

我仍然不知道是什么原因造成的,但是我以不同的方式重新编写了代码,现在它可以一次正确地捕获所有内容:

foreach(glob("*.xml") as $filename) {
$domsrc = file_get_contents($filename, FILE_TEXT);
$MYdom = new DomDocument();
$MYdom->loadXML($domsrc);
$xpath = new DOMXPath($MYdom);
$nodeList = $xpath->query('//URL[@Type="Virtual Tour"]');

foreach ($nodeList as $node){
if ($nodeList->length>0) {
        $node->parentNode->removeChild($node);
    }
}
$MYdom->save($filename);

同样,不知道为什么它不能一次性使用其他代码,但希望这会帮助其他可能遇到类似问题的人。

于 2013-09-20T20:11:53.307 回答