2016-09-14 2 views
1

私はXMLファイルを持っており、PHPスクリプトを使用して2つのノード間に新しいノードを挿入しようとしています。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:私は彼がwrotes何ビット、最後にコードが右やっているを変更

@ThW応答の後:

$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と第六百六十一要素ノードです。しかし、その親ノードはドキュメント要素ではありません。の間に別の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

これはあなたが書いたのとまったく同じです。しかし、私が659の前に新しい "トラック"要素を作成するように変更しようとすると、動作しません。たぶん私はそれをひどく変更しました。 – user3746625

+0

XML文書には915 というタグがあります。 – user3746625

+0

それらはすべて同じ '時間'の親要素にありますか?ポジションは最も安定した状態のようには聞こえませんが、別のものがありますか? – ThW

関連する問題