добавить несколько дочерних элементов в один элемент XML с помощью переполнения стека

Я думаю, что эта задача не сложная, но, похоже, я не могу понять …

Вот данные, которые у меня есть:

        $_SESSION["username"]
$_SESSION["id"]

Я хочу сохранить их в XML-файле с именем accounts.xml при регистрации. Этот вопрос не обо всем процессе, мне только интересно, как правильно хранить это. После процесса я хочу иметь эти новые структуры в моем XML-файле:

       <account>
<username>  value of $_SESSION["username"]  </username>
<user_id>  value of $_SESSION["id"]  </user_id>
</account>

Это код, который я использую до сих пор:

        $xml = simplexml_load_file('accounts.xml');

$new = new SimpleXMLElement("<account></account>");
$new->addChild('username', '$_SESSION["username"]');
$new->addChild('user_id', '$_SESSION["id"]');

file_put_contents('accounts.xml', $xml->asXML());

Я попробовал некоторые варианты, но обычно я получаю что-то вроде этого:

       <username>  $_SESSION["username"]
<user_id>  $_SESSION["id"]  </user_id>
</username>

Как видите, у меня есть несколько проблем:

1 .: < элемент account> даже не создан.
2 .: user_id находится внутри имени пользователя — я не хочу этого
и 3 .: сами переменные хранятся в файле, а не их значения …

Можете ли вы помочь мне сделать все правильно, здесь?

примечание: важно, чтобы при запуске другой регистрации этот код снова работал, не удаляя и не перезаписывая ничего, просто добавляя другую структуру, как указано выше

Заранее спасибо!

1

Решение

        $xml = simplexml_load_file('accounts.xml');$account = $xml->addChild('account');
$account->addChild('username', $_SESSION["username"]);
$account->addChild('user_id', $_SESSION["id"]);file_put_contents('accounts.xml', $xml->asXML());

РЕШИТЬ

1

Другие решения

Я настоятельно рекомендую использовать DOM или XMLWriter для создания XML. Апис гораздо чище и мощнее. В DOM он состоит из 2 частей:

  1. Создайте узел, используя DOMDocument метод как createElement(), createTextNode(),
  2. Добавьте узел к его родителю (Документ или Элемент), используя appendChild(), insertChild()

Кроме того, вы можете использовать свойства и методы узла, чтобы изменить его.

$document = new DOMDocument();
$account = $document
->appendChild($document->createElement('account'));
$account
->appendChild($document->createElement('username'))
->appendChild($document->createTextNode('John Doe'));
$account
->appendChild($document->createElement('user_id'))
->appendChild($document->createTextNode(42));
$document->formatOutput = TRUE;
echo $document->saveXml();

XMLWriter:

$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(true);
$writer->startDocument('1.0', 'utf-8');
$writer->startElement('account');
$writer->writeElement('username', 'John Doe');
$writer->writeElement('user-id', 42);
$writer->endElement();
$writer->endDocument();
echo $writer->outputMemory();

Вы должны иметь в виду, что все в документе XML является узлом. Элемент, атрибуты, разделы cdata и т. Д. SimpleXML ограничен и позволяет вам получать доступ только к его частям.

1