如何使用项目(索引)删除子节点?



我正在编写一个脚本,用于在多个XML文件中搜索某些标签,然后如果在此名为update的标签中找到它,我需要删除该子标签,然后再次添加它。

问题是我不明白为什么它不删除我要删除的节点。

好的,所以我的脚本(我想讨论的重要部分(如下所示:

/*
// Pushing all offers from all files to $allOffers array
*/
foreach ($offerFiles as $file)
{
$file = $path . "\" . $file;
$currentXML = new SimpleXMLElement($file, 0, true);
foreach($currentXML->offer as $offer)
{
if ($offer->number) {
if (!check_if_exists($compiledXML, $offer->number))
{ 
//array_push($allOffers, $offer); 
} 
if (check_if_exists($compiledXML, $offer->number) && $offer->action == "update")
{
update_existing_entry($compiledFile, $compiledXML, $offer); 
// var_dump($allOffers);
}
}
}
}
/*
// Find and delete existing XML entry offer with update action
*/
function update_existing_entry ($compiledFile, $compiledXML, $parsedOffer) {

$index = 0;
$doc = new DOMDocument();
$doc->load($compiledFile);
$elem = $doc->documentElement;

foreach ($compiledXML->offer as $offer) {  
if ((string)$parsedOffer->number === (string)$offer->number) {
$firstchild =  $doc->getElementsByTagName('offer')->item($index);
// $firstchild->nodeValue = null;
$elem->removeChild($firstchild);
$doc->save($compiledFile);
//var_dump($parsedOffer->asXML());   
}
$index++;
}
var_dump($deleteNodes);
}

现在,如果我有 2 个 XML 文件,一个带有更新操作,另一个没有它,那么它就可以完美地工作。当 1 和 2 文件具有更新操作时,问题开始,然后我总是只以一个已删除的节点和错误结束:

致命错误:

未捕获的类型错误:参数 1 传递给 DOMNode::removeChild(( 必须是 DOMNode 的实例,给定

为什么我不能删除具有选定索引的节点?

我不知道这是否是最好的方法,但我以这种方式修复了它:

function update_existing_entry ($compiledFile, $compiledXML, $parsedOffer) {

$doc = new DOMDocument();
$doc->load($compiledFile);
$node = $doc->documentElement;
foreach ($doc->getElementsByTagName('offer') as $child) {
if (strpos($child->nodeValue, (string)$parsedOffer->number) !== false) {
$node->removeChild($child);
}
}
$doc->save($compiledFile);
}

最新更新