PHP appendChild 到 XML root
PHP appendChild to XML root
我知道这应该很简单,但我是 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>
之外。
准确的错误是:
Notice: Undefined property: DOMDocument::$root
$xml->root
不是在此上下文中访问根元素的正确方法,因为 $xml
是 DOMDocument
的一个实例(如果 $xml
是SimpleXMLElement
代替)。您可以从 documentElement
属性 :
获取 DOMDocument
对象的根元素
$xml->documentElement->appendChild($playerElement);
或者,更一般地说,您可以使用 getElementsByTagName()
按名称获取元素:
$xml->getElementsByTagName("root")->item(0)->appendChild($playerElement);
进一步阅读: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.";
}
您正试图像处理标准对象一样处理 dom,但事实并非如此。
要查找元素,您需要使用函数 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>
我知道这应该很简单,但我是 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>
之外。
准确的错误是:
Notice: Undefined property: DOMDocument::$root
$xml->root
不是在此上下文中访问根元素的正确方法,因为 $xml
是 DOMDocument
的一个实例(如果 $xml
是SimpleXMLElement
代替)。您可以从 documentElement
属性 :
DOMDocument
对象的根元素
$xml->documentElement->appendChild($playerElement);
或者,更一般地说,您可以使用 getElementsByTagName()
按名称获取元素:
$xml->getElementsByTagName("root")->item(0)->appendChild($playerElement);
进一步阅读: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.";
}
您正试图像处理标准对象一样处理 dom,但事实并非如此。 要查找元素,您需要使用函数 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>