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

XML child element does not get added but does not throw any errors in PHP

根据我的 跟进。

我正在使用 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 文件。没有显示任何错误。

为什么不附加子元素?

您要添加到 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

如果您输出完整的 XML,带有 echo $xml->asXML(),您将看到,根据您的要求,已添加 其他 child 个节点到第一个评论节点:

<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$comment->user,你得到具有该名称的 first child 元素; $xml->comment[0]$comment->user[0] 只是 short-hand。这实际上对于浏览 XML 文档非常方便,因为您不必知道是否有一个或多个元素具有特定名称,您可以写 $xml->comment->user$xml->comment[0]->user[0]$xml->comment->user[0]等等。

自从你叫 addChild 以来,新的 userdatetext 并不是第一个使用这个名字的 children,所以它们不会出现在您的输出中。

如果您想要创建一条新评论,您需要先添加:

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

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

$comment = $xml->comment[0]; // or just $comment = $xml->comment;
$comment->user = 'User2245';

或者您可以向每个 现有评论添加一些内容(请注意,我们在这里使用 $xml->comment 就好像它是一个数组;同样,SimpleXML 无论是否存在一个或多个匹配元素,都会让我们这样做):

foreach ( $xml->comment as $comment ) {
    $comment->addChild('modified', 'true');
}