PHP appendChild в корень XML

Я знаю, что это должно быть просто, но я новичок в PHP и просто не понимаю документацию, с которой столкнулся. Мне нужно простое объяснение.

У меня есть документ XML, к которому я хотел бы добавить узлы. Я могу добавить узлы в документ, они появляются только за пределами корневого узла и вызывают ошибки при последующих попытках.

Вот мой XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
</root>

и вот мой PHP:

$playerID = "id_" . $_POST['player'];

//load xml file to edit
$xml = new DOMDocument();
$xml->load('../../saves/playerPositions.xml') or die("Error: Cannot load file.");

//check if the player is already in the database
if(isset($xlm->$playerID)){
echo "Player ID was found.";
}
else{
echo "Player ID was not found.";

//so we want to create a new node with this player information
$playerElement = $xml->createElement($playerID, "");
$playerName = $xml->createElement("name", "John Doe");

//add the name to the playerElement
$playerElement->appendChild($playerName);

//add the playerElement to the document
//THIS IS WHERE THE ERROR OCCURS
$xml->root->appendChild($playerElement);

//save and close the document
$xml->formatOutput = true;
$xml->save("../../saves/playerPositions.xml");
}

echo "done";

Если я просто использую $xml->appendChild() затем я могу изменить документ, но новый текст появляется за пределами <root></root>,

Точная ошибка:

Примечание: неопределенное свойство: DOMDocument :: $ root

0

Решение

$xml->root не является правильным способом доступа к корневому элементу в этом контексте, так как $xml это пример DOMDocument (Это будет работать, если $xml мы SimpleXMLElement вместо). Вы можете получить корневой элемент DOMDocument объект из documentElement имущество :

$xml->documentElement->appendChild($playerElement);

eval.in demo 1

Или, в более общем смысле, вы можете получить элемент по имени, используя getElementsByTagName() :

$xml->getElementsByTagName("root")->item(0)->appendChild($playerElement);

eval.in demo 2

Дальнейшее чтение : PHP DOM: Как элегантно получить дочерние элементы по имени тега?


Тем не менее, эта часть вашего кода также неверна по той же причине (плюс опечатка?):

if(isset($xlm->$playerID)){
echo "Player ID was found.";
}

Заменить getElementsByTagName() :

if($xml->getElementsByTagName($playerID)->length > 0){
echo "Player ID was found.";
}
1

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

Вы пытаетесь обращаться с домом как Стандартный объект, но это не так.
Чтобы искать элементы, вам нужно использовать функцию getElementsByTagName и обрабатывать dom как набор узлов, например:

$xml = new DOMDocument();
$xml->loadXML('<?xml version="1.0" encoding="UTF-8"?>
<root>
</root>') or die("Error: Cannot load file.");

$len = $xml->getElementsByTagName('player')->length;
if ( $len > 0 ) {

} else {
$player = $xml->createElement('player', '');
$playerName = $xml->createElement('playerName', "Jhon Doe");
$player->appendChild( $playerName );

$root = $xml->getElementsByTagName('root');

if ( $root->length > 0 ) {
$root[0]->appendChild( $player );
}

$xml->formatOutput = true;
echo $xml->saveXML();
}

Этот код производит:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<player><playerName>Jhon Doe</playerName></player></root>
0

По вопросам рекламы [email protected]