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();
如果您输出完整的 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
以来,新的 user
、date
和 text
并不是第一个使用这个名字的 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');
}
根据我的
我正在使用 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();
如果您输出完整的 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
以来,新的 user
、date
和 text
并不是第一个使用这个名字的 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');
}