php 不添加XML子元素,但不引发任何错误

yk9xbfzb  于 2023-11-16  发布在  PHP
关注(0)|答案(2)|浏览(98)

我正在使用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文件。没有显示任何错误。
为什么不追加子元素?

c9qzyr3d

c9qzyr3d1#

您正在添加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

vybvopom

vybvopom2#

如果使用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$comment->user这样的元素,则会得到具有该名称的 first 子元素;它只是$xml->comment[0]$comment->user[0]的简写。这实际上对于浏览XML文档非常方便,因为你不必知道是否有一个或几个元素具有特定的名称,你可以写$xml->comment->user$xml->comment[0]->user[0]$xml->comment->user[0]等等。
由于您调用了addChild,新的userdatetext不是第一个具有该名称的子节点,因此它们不会显示在您的输出中。
如果你想创建一个新的评论,你需要先添加:

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


如果你想要的是 * 改变子元素的值 *,你可以直接写入它们,而不是添加一个新的子元素:

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


或者你可以给每个现有的注解添加一些东西(注意,这里我们使用$xml->comment,就像它是一个数组一样;同样,SimpleXML将允许我们这样做,无论有一个还是多个匹配元素):

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

相关问题