XML在另一个PHP之前创建节点

时间:2016-09-14 17:34:10

标签: php xml

我有一个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');

我正在尝试在“track”标签号660之前插入新节点,但是当我尝试打开php文件时它根本不起作用。

有谁能告诉我我做错了什么?

SOLUTION:

在@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');

1 个答案:

答案 0 :(得分:1)

$elem[660]是第661个元素节点,标记名为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();