Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP DOM从XML中删除子项_Php_Xml_Dom_Removechild - Fatal编程技术网

使用PHP DOM从XML中删除子项

使用PHP DOM从XML中删除子项,php,xml,dom,removechild,Php,Xml,Dom,Removechild,我想从这个xml(filename.xml)中删除第一个视频元素(video src=time.mp4),并将xml保存到filename4.smil中: <?xml version="1.0" encoding="utf-8"?> <smil> <stream name="mysq"/> <playlist name="Default" playOnStream="mysq" repeat="true" scheduled="2010-01-0

我想从这个xml(filename.xml)中删除第一个视频元素(video src=time.mp4),并将xml保存到filename4.smil中:

<?xml version="1.0" encoding="utf-8"?>
<smil>
  <stream name="mysq"/>
  <playlist name="Default" playOnStream="mysq" repeat="true" scheduled="2010-01-01 01:01:00">
    <video src="time.mp4" start="0" length="-1"> </video>
    <video src="sample.mp4" start="0" length="-1"> </video>
  </playlist>
</smil>

我正在使用此代码,但不起作用:

<?php 


$doc = new DOMDocument; 
$doc->load("filename.xml"); 

$thedocument = $doc->documentElement; 

//this gives you a list of the messages 
$list0 = $thedocument->getElementsByTagName('playlist'); 
$list = $list0->item(0);


$nodeToRemove = null; 
foreach ($list as $domElement){ 
$videos = $domElement->getElementsByTagName( 'video' );
$video = $videos->item(0);
    $attrValue = $video->getAttribute('src'); 
    if ($attrValue == 'time.mp4') { 
    $nodeToRemove = $videos; //will only remember last one- but this is just an example :) 


    } 

} 

//Now remove it. 
if ($nodeToRemove != null) 
$thedocument->removeChild($nodeToRemove); 

$doc->save('filename4.smil');

?>

假设只有一个播放列表项,并且您希望从中删除第一个视频元素,这里有两种方法

这一个在代码中使用
getElementsByTagName()
,但simple从每个列表中选择第一项,然后删除该项(必须使用
parentNode
删除子节点)

这个版本使用更灵活的XPath,它查找内部某处带有视频元素的播放列表元素。同样,只需取下第一个并移除它

$xp = new DOMXPath($doc);
$video = $xp->query('//playlist//video')->item(0);
$video->parentNode->removeChild($video);
问题在于

$thedocument->removeChild($nodeToRemove);

您正在尝试从基础文档中删除子元素。由于此节点嵌套在层次结构中,因此无法将其删除,您需要将其从其直接父节点中删除。

使用Xpath表达式,您可以获取具有特定
src
属性的视频节点,对其进行迭代并将其删除

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);

$expression = '/smil/playlist/video[@src="time.mp4"]';
foreach ($xpath->evaluate($expression) as $video) {
    $video->parentNode->removeChild($video);
}

var_dump($document->saveXML());
也可以按位置提取节点:
/smil/playlist/video[1]

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);

$expression = '/smil/playlist/video[@src="time.mp4"]';
foreach ($xpath->evaluate($expression) as $video) {
    $video->parentNode->removeChild($video);
}

var_dump($document->saveXML());