2016-09-14 39 views
1

我有一个XML文件,我试图用PHP脚本在两个其他人之间插入一个新节点。XML在另一个PHP之前创建节点

XML文件:

<playlistLog> 
    <hour> 
    <track> 
     <type>take</type> 
     <url>URL</url> 
     <title>1473869236.wav</title> 
     <mix>0</mix> 
    </track> 
    (...) 
    </hour> 
</playlistLog> 

PHP文件:

$xmldoc = new DOMDocument(); 

$xmldoc->load('../logs/log14-09-2016.xml'); 

$elem = $xmldoc->getElementsByTagName("track"); 

$track = $xmldoc->createElement('track'); 

$type = $xmldoc->createElement('type', 'take'); 
$track->appendChild($type); 

$url = $xmldoc->createElement('url', 'url'); 
$track->appendChild($url); 

$title = $xmldoc->createElement('title', 'title'); 
$track->appendChild($title); 

$mix = $xmldoc->createElement('mix', 'mix'); 
$track->appendChild($mix); 

$xmldoc->documentElement->insertBefore($track,$elem[660]); 
$xmldoc->save('../logs/log14-09-2016.xml'); 

我试图插入之前 “跟踪” 标签编号660的新节点,但是当我尝试打开PHP文件它根本不起作用。

有人可以告诉我我做错了什么吗?

SOLUTION:

@ThW响应后,我改变了一下他wrotes什么,最后的代码是做正确的:

$document = new DOMDocument(); 
$document->preserveWhiteSpace = FALSE; 
$document->load('../logs/log14-09-2016.xml'); 
$xpath = new DOMXpath($document); 
$previousTrack = $xpath->evaluate('/playlistLog/hour/track')->item(659); 
$newTrack = $previousTrack->parentNode->insertBefore($document->createElement('track'),$previousTrack); 
$newTrack 
->appendChild($document->createElement('type')) 
->appendChild($document->createTextNode('take')); 
$document->formatOutput = TRUE; 
echo $document->save('../logs/log14-09-2016.xml'); 
+0

什么不行?如果显示任何错误,请将它们添加到您的问题中。如果脚本运行但结果不符合您的期望,请展示结果和期望的结果。 – lucash

+0

@lucash它只是不加载PHP页面。所以它什么都不做。 – user3746625

回答

1

$elem[660]与标签名称track的第661次元素节点。但是它的父节点不是文档元素。这是另一个hour之间的祖先。你提供给insertBefore()的节点有一个不同的父节点,然后是你添加新元素的节点。

您可以使用$ parentNode属性来确保您追加到该节点。

另外我建议使用Xpath来获取跟踪节点。

$xml = <<<'XML' 
<playlistLog> 
    <hour> 
    <track> 
     <type>take</type> 
     <url>URL</url> 
     <title>1473869236.wav</title> 
     <mix>0</mix> 
    </track> 
    </hour> 
</playlistLog> 
XML; 

$document = new DOMDocument(); 
$document->preserveWhiteSpace = FALSE; 
$document->loadXml($xml); 

$xpath = new DOMXpath($document); 
$previousTrack = $xpath->evaluate('/playlistLog/hour/track[1]')->item(0); 

$newTrack = $previousTrack 
    ->parentNode 
    ->insertBefore(
    $document->createElement('track'), 
    $previousTrack 
); 

$newTrack 
    ->appendChild($document->createElement('type')) 
    ->appendChild($document->createTextNode('take')); 

$document->formatOutput = TRUE; 
echo $document->saveXml(); 
+0

这和你写的完全一样。但是,当我试图改变它在659th之前创建新的“轨道”元素时,它不会起作用。也许我改变了很糟糕。 – user3746625

+0

该XML文档有915个标签。 – user3746625

+0

它们全都在同一个'hour'父元素中吗?位置听起来不像最稳定的状态,在这里是另一个? – ThW

相关问题