2011-07-19 48 views
2

我正在开发一个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');   

会很高兴,如果这能回答为好;)

回答

1

此:

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

应该是:

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

毕竟,<Nick>不是根节点,但它的第一个孩子

+0

我还有一个疑问。我如何添加元素; Cray

+0

顺便说一句,多谢队友。你的回答确实有助于解决我的问题。 – Cray

+0

'$ override = $ xml-> createElement(“Overrideable”); $ override-> setAttribute('enabled','false'); $ ban-> appendChild($ override);' – Wrikken

1

要追加一个新的子树是这样的:

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

因此,建立一个结构,然后appendChild到/禁令/尼克。

在旁注中,您的元素命名有些问题,因为您的元素名称根据它们出现的位置具有不同的语义。虽然你可以做到这一点,我认为你可以使它不那么除去模棱两可/禁令/尼克干脆就用:

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

,那么只需在附加到根元素。

+0

嘿谢谢您的回复。是的,我没有注意到元素命名的变化。我不想编辑我的XML树,因为使用此XML文件的应用程序依赖于特定的树布局来执行其功能;) – Cray

+0

@Cray好了,即使保留布局,IMO仍然更容易追加新的子节点而不是使用insertBefore。 – Gordon