XML子元素未添加,但不会在PHP中引发任何错误

时间:2018-10-01 21:10:27

标签: php xml simplexml

跟随我的previous question

我正在使用addChild()添加另一个<comment>元素作为根元素的子元素。我使用了this问题中的代码:

$file = "comments.xml";

$comment = $xml -> comment;

$comment -> addChild("user","User2245");
$comment -> addChild("date","02.10.2018");
$comment -> addChild("text","The comment text goes here");

$xml -> asXML($file)

现在,当我回显文件内容时:

foreach($xml -> children() as $comments) { 
  echo $comments -> user . ", "; 
  echo $comments -> date . ", "; 
  echo $comments -> text . "<br>";
}

我只得到旧文件的内容(没有任何更改):

User4251,02.10.2018,Comment body goes here
User8650,02.10.2018,Comment body goes here

我正在使用相同的 comments.xml 文件。没有显示错误。

为什么子元素没有附加?

2 个答案:

答案 0 :(得分:1)

您要添加到comment元素之一,并将其​​添加到完整文档中。

$xml = new simplexmlelement('<?xml version="1.0" encoding="utf-8"?>
<comments><comment>
  <user>User4251</user>
  <date>02.10.2018</date>
  <text>Comment body goes here</text>
</comment>
<comment>
  <user>User8650</user>
  <date>01.10.2018</date>
  <text>Comment body goes here</text>
</comment></comments>');
$child = $xml->addchild('comment');
$child->addChild("user","User2245");
$child->addChild("date","02.10.2018");
$child->addChild("text","The comment text goes here");
echo $xml->asXML();

https://3v4l.org/Pln6U

答案 1 :(得分:1)

如果使用echo $xml->asXML()输出完整的XML,您将看到,根据要求,在第一个注释节点上添加了其他子节点

<comment>
    <user>User4251</user>
    <date>02.10.2018</date> 
    <text>Comment body goes here</text> 
    <user>User2245</user><date>02.10.2018</date><text>The comment text goes here</text>
</comment>

仅第一个comment被更改的原因与您的echo不显示新值的原因相同:如果您引用的元素为$xml->comment或{{1 }},您将获得具有该名称的 first 子元素;这只是$comment->user$xml->comment[0]的简写。实际上,这对于浏览XML文档非常方便,因为您不必知道是否存在一个或多个具有特定名称的元素,可以编写$comment->user[0]$xml->comment->user$xml->comment[0]->user[0]等等。

自从您致电$xml->comment->user[0]以来,新的addChilduserdate并不是该名字的第一个孩子,因此他们不会出现在您的输出。

如果您要创建新评论,则需要先添加该评论:

text

如果您想要更改子元素的值,则可以直接写入它们,而不必添加新的子元素:

$comment = $xml->addChild('comment');
$comment->addChild('user', 'User2245');

或者您可以在现有注释的每个中添加一些内容(请注意,这里我们使用$comment = $xml->comment[0]; // or just $comment = $xml->comment; $comment->user = 'User2245'; 就像是一个数组;同样,无论是否存在一个,SimpleXML都会让我们执行此操作或几个匹配的元素):

$xml->comment