将节点添加到 XML 树的更深分支中

发布于 2024-11-25 14:22:46 字数 2513 浏览 1 评论 0原文

我正在开发一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

隐诗 2024-12-02 14:22:46

这个:

$root->insertBefore($ban,$ori);

应该是:

$fnode->insertBefore($ban,$ori);

毕竟不是根节点,而是它的第一个子节点

This:

$root->insertBefore($ban,$ori);

Should be:

$fnode->insertBefore($ban,$ori);

After all, <Nick> is not the rootnode, but the first child of it

世界等同你 2024-12-02 14:22:46

您想要像这样附加一个新的子树:

 <Ban>
    <Overrideable enable="false"/>
    <Nick>newuser</Nick>
 </Ban>

因此,构建该结构,然后 appendChild 致/禁令/尼克。

顺便说一句,您的元素命名有些问题,因为您的元素名称根据它们出现的位置而具有不同的语义。虽然您可以做到这一点,但我认为您可以通过完全删除 /Bans/Nick 并仅使用:

<Bans version="1.036">
   <Ban>
      <Overrideable enable="false"/>
      <Nick>cray</Nick>
   </Ban>
</Bans>

然后您只需附加到根元素即可使其不那么模糊。

You want to append a new subtree like this:

 <Ban>
    <Overrideable enable="false"/>
    <Nick>newuser</Nick>
 </Ban>

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:

<Bans version="1.036">
   <Ban>
      <Overrideable enable="false"/>
      <Nick>cray</Nick>
   </Ban>
</Bans>

Then you would simply append to the root element.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文