将节点添加到 XML 树的更深分支中
我正在开发一个 Web 界面,使管理员能够禁止/取消禁止我的服务器上的特定用户,该服务器的软件依赖于 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');
如果这个问题也能得到解答,我会很高兴;)
I'm developing a web interface that enables admins to ban/unban particular users from my server whose software depends on an XML file to determine ban status of users. Initially, the 'Bans.xml' has the following contents.
<Bans version="1.036">
<Nick>
<Ban>
<Overrideable enable="false"/>
<Nick>cray</Nick>
</Ban>
</Nick>
</Bans>
How do I write a php code so that I get the following XML file?
<Bans version="1.036">
<Nick>
<Ban>
<Overrideable enable="false"/>
<Nick>cray</Nick>
</Ban>
<Ban>
<Overrideable enable="false"/>
<Nick>newuser</Nick>
</Ban>
</Nick>
</Bans>
So far I've managed to write the following script:
<?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');
?>
But all that the above code gives me is:
<Bans version="1.036">
<Nick>
<Ban>
<Overrideable enable="false"/>
<Nick>cray</Nick>
</Ban>
</Nick>
<Ban>
<Nick>Crayaas</Nick>
</Ban>
</Bans>
--------I've managed to add the nodes properly by replacing;---------
$root->insertBefore($ban,$ori);
With the following code;
$fnode->insertBefore($ban,$ori);
My one last question is, how do i remove a particular ban, where nick is equal to a user supplied string stored in the variable $buser. I used the following code. But using $buser in the condition creates errors.
$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');
Would be glad if this could be answered as well ;)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个:
应该是:
毕竟
不是根节点,而是它的第一个子节点This:
Should be:
After all,
<Nick>
is not the rootnode, but the first child of it您想要像这样附加一个新的子树:
因此,构建该结构,然后 appendChild 致/禁令/尼克。
顺便说一句,您的元素命名有些问题,因为您的元素名称根据它们出现的位置而具有不同的语义。虽然您可以做到这一点,但我认为您可以通过完全删除 /Bans/Nick 并仅使用:
然后您只需附加到根元素即可使其不那么模糊。
You want to append a new subtree like this:
Hence, build that structure and then appendChild to /Bans/Nick.
On a sidenote, your element naming is somewhat questionable because your element names have different semantics depending on where they occur. While you can do that, I think you could make it less ambiguous by removing /Bans/Nick altogether and just use:
Then you would simply append to the root element.