2016-10-02 1 views
0

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

У меня есть документ 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>.

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

Notice: Undefined property: DOMDocument::$root

+0

Какой из них вы имеете в ваш фактический код, '$ xml-> root -> ...' или '$ xml -> $ root -> ...'? – har07

+0

Если я использую $ xml-> root-> appendChild(), тогда ошибка DOMDocument :: $ root Если я использую $ xml -> $ root-> appendChild(), тогда ошибка DOMDocument :: root Но я я использую «корень», поскольку я понимаю, что это был более правильный способ сделать это.OP - мой точный код. – user1544522

+0

Хорошо, но сообщение об ошибке не соответствует коду, поэтому оно запутывает. Сообщение об ошибке, которое я получил с '$ xml-> root': * Fatal error: вызов функции-члена' appendChild() 'on' null' * – har07

ответ

1

$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: How to get child elements by tag name in an elegant manner?


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

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

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

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

Когда я начал код, я пытался использовать SimpleXMLElement и cann ' t получить его, чтобы прочитать файл. Я закончил с DOMDocument, не понимая, что это была другая структура. Хотя этот синтаксис длиннее, мне удобнее, потому что он похож на JavaScript и XML. Спасибо за вашу помощь. – user1544522

0

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

$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>