如何在不覆盖的情况下附加XML数据?

时间:2018-01-27 14:55:12

标签: php

我正在编写XML文件:

<?php
$xml2 = "currenttest";

$xml  = new DOMDocument("1.0");

$root = $xml->createElement ('tv');
$xml->appendChild($root); 

$root->appendChild($xml->createTextNode("\n"));
$root->appendChild($xml->createTextNode($xml2));
$root->appendChild($xml->createTextNode("\n"));

$xml->save('epg.xml');

XML:

<?xml version="1.0"?>
<tv>
test
</tv>

如果我更改文本并再次运行代码,则会删除旧内容。

我希望保留旧文本。

我们这样说:

<?xml version="1.0"?>
<tv>
currenttest...
newtest...
</tv>

我之前的方法是用以下内容编写XML:

file_put_contents($file, $xml2, FILE_APPEND | LOCK_EX);

FILE_APPEND | LOCK_EX,它帮助我以前的文本不会被删除

我在另一篇文章中找到了解决方案:

$doc->loadXML(file_get_contents('epg.xml'));
foreach($doc->getElementsByTagName('***') as $node)
{
}

但它如何适合我的代码呢?

2 个答案:

答案 0 :(得分:0)

您无需做任何特别的事情,只需重新加载您的xml字符串并将新文本节点附加到根元素:

// your previous code (I only changed the variable names and added a default encoding)

$text = "currenttest";

$dom = new DOMDocument("1.0", "UTF-8");

$root = $dom->createElement('tv');
$dom->appendChild($root); 

$root->appendChild($dom->createTextNode("\n"));
$root->appendChild($dom->createTextNode($text));
$root->appendChild($dom->createTextNode("\n"));

$xml = $dom->saveXML();

// let's add a new element

$newtext = 'newtext';

$dom = new DOMDocument;
$dom->loadXML($xml);

$root = $dom->documentElement; // conveniant way to target the root element
// but you can also write:
//$root = $dom->getElementsByTagName('tv')->item(0);

$root->appendChild($dom->createTextNode($newtext));

$newxml = $dom->saveXML();

echo $newxml;

demo

关于$doc->loadXML(file_get_contents('epg.xml'));,请注意您不需要使用file_get_contents,因为DOMDocument已经有两种方法:

  • DOMDocument::loadXML从字符串加载xml内容。
  • DOMDocument::load直接从文件中加载xml内容

除了DOMNode::appendChild在该元素的所有子节点之后向元素添加节点之外,还有DOMNode::insertBefore在您选择的子节点之前向节点添加节点。

答案 1 :(得分:0)

我在上面尝试了代码,因为我正在覆盖我的数据,但是当我在我的应用程序中编码时,它没有工作,因为我试图在加载的 xml 中添加新的节点数据,您必须创建一个在里面添加数据的根。

  $xml = new DOMDocument("1.0", "UTF-8");
    //an tag root must be first thing to add
    $root = $xml->createElement('root');
    $xml->appendChild($root); 

然后,在需要的时候添加数据

   $xml = new DOMDocument("1.0", "UTF-8");
   $xml->load($sFilepath);
   $root = $xml->getElementsByTagName('root')->item(0);

您的结构必须如下所示:

<xml version="1.0" encoding="UTF-8">
<root>
</root>

上面的答案是完全正确的。此答案仅在有人难以理解时提供帮助。