Дочерний элемент XML не добавляется, но не выдает никаких ошибок в PHP - PullRequest
0 голосов
/ 02 октября 2018

В продолжение моего предыдущего вопроса .

Я использую addChild() для добавления другого элемента <comment> в качестве дочернего элемента корневого элемента.Я использовал код из этого вопроса:

$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 голосов
/ 02 октября 2018

Если вы выводите полный XML с echo $xml->asXML(), вы увидите, что, как вы просили, дополнительные дочерние узлы были добавлены к первому узлу комментария:

<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, вы сначала получаете дочерний элемент с таким именем;это просто сокращение для $xml->comment[0] или $comment->user[0].Это действительно очень удобно для навигации по документам XML, потому что вам не нужно знать, есть ли один или несколько элементов с определенным именем, вы можете написать $xml->comment->user или $xml->comment[0]->user[0] или $xml->comment->user[0] и т. Д.

Поскольку вы позвонили addChild, новые user, date и text не первые дети с таким именем, поэтому они не отображаются в вашем выводе.

Если вы хотели создать новый комментарий , вам нужно сначала добавить это:

$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');
}
0 голосов
/ 02 октября 2018

Вы добавляете к одному из 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

...