我正在开发一个Web界面,使管理员可以禁止/取消特定用户从我的服务器(其软件依赖于XML文件)来确定用户的禁止状态。最初,'Bans.xml'具有以下内容。将节点添加到XML树的更深层分支
<Bans version="1.036">
<Nick>
<Ban>
<Overrideable enable="false"/>
<Nick>cray</Nick>
</Ban>
</Nick>
</Bans>
如何编写一个php代码,以便获得以下XML文件?
<Bans version="1.036">
<Nick>
<Ban>
<Overrideable enable="false"/>
<Nick>cray</Nick>
</Ban>
<Ban>
<Overrideable enable="false"/>
<Nick>newuser</Nick>
</Ban>
</Nick>
</Bans>
到目前为止,我已经成功地写下面的脚本:
<?php
$xml=new DOMDocument();
$xml->formatOutput=true;
$xml->preserveWhiteSpace=false;
$xml->load("Bans.xml");
$root=$xml->documentElement;
$fnode=$root->firstChild;
$ori=$fnode->childNodes->item(2);
$nick=$xml->createElement("Nick");
$nickText=$xml->createTextNode("newuser");
$nick->appendChild($nickText);
$ban=$xml->createElement("Ban");
$ban->appendChild($nick);
$root->insertBefore($ban,$ori);
header("Content-type:text/xml");
$xml->save('Bans.xml');
?>
但是,所有上面的代码给我的是:
<Bans version="1.036">
<Nick>
<Ban>
<Overrideable enable="false"/>
<Nick>cray</Nick>
</Ban>
</Nick>
<Ban>
<Nick>Crayaas</Nick>
</Ban>
</Bans>
------- - 我已经设法通过替换来正确添加节点; ---------
$root->insertBefore($ban,$ori);
用下面的代码;
$fnode->insertBefore($ban,$ori);
我最后一个问题是,我如何删除特定禁令,其中nick等于用户提供的字符串存储在变量$ buser中。我使用了下面的代码。但在这种情况下使用$ buser会产生错误。
$buser="newuser";
$dom=new DOMDocument();
$dom->load('settings/Bans.xml');
$bans=$dom->documentElement;
$xpath=new DOMXpath($dom);
$result=$xpath->query('/Bans/Nick/Ban[Nick="$buser"]');
$result->item(0)->parentNode->removeChild($result->item(0));
header("Content-type: text/xml");
$dom->save('settings/Bans.xml');
会很高兴,如果这能回答为好;)
我还有一个疑问。我如何添加元素; –
Cray
顺便说一句,多谢队友。你的回答确实有助于解决我的问题。 – Cray
'$ override = $ xml-> createElement(“Overrideable”); $ override-> setAttribute('enabled','false'); $ ban-> appendChild($ override);' – Wrikken