我正在开发一个web界面,使管理员能够禁止/unban特定用户从我的服务器,其软件依赖于XML文件来确定禁止状态的用户。最初,'Bans.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');
如果这个问题也能得到回答,我将很高兴;)
This:
$root->insertBefore($ban,$ori);
应:$fnode->insertBefore($ban,$ori);
毕竟,<Nick>
不是根节点,而是它的第一个子节点
您想要像这样添加一个新的子树:
<Ban>
<Overrideable enable="false"/>
<Nick>newuser</Nick>
</Ban>
因此,构建该结构,然后将child附加到/Bans/Nick。
顺便说一下,您的元素命名有些问题,因为元素名称根据它们出现的位置有不同的语义。虽然你可以这样做,但我认为你可以通过完全删除/Bans/Nick并使用:
来减少歧义。<Bans version="1.036">
<Ban>
<Overrideable enable="false"/>
<Nick>cray</Nick>
</Ban>
</Bans>
那么你只需在根元素后面加上