2011-07-19 88 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