2011-06-27 22 views
2

我有一個名爲processDeleteForm()的PHP函數,用於從名爲structure.xml的xml文檔中移除指定的節點。到目前爲止,我唯一遇到的問題是,在processDeleteForm()中,它通過循環遍歷父節點的每個子節點來搜索要刪除的節點,並通過「name」屬性匹配它,但是我沒有無法獲得正確數量的循環子節點,因此它在到達正確節點之前停止。相關代碼:爲什麼count(DOMNode-> childNodes)返回的孩子數量不正確? (PHP和XML)

function processDeleteForm($dir, $filename) 
{ 
    echo "Processing delete request.<br/>"; 
    echo "Request to delete ".$filename." from ".$dir.".<br/>"; 
    $xmlDoc = new DOMDocument(); 

    $xmlDoc->load("structure.xml"); 
    $node = dirDOMNodeWritable($dir, $xmlDoc); 

    $target; 
    echo "Working directory has ".count($node->childNodes)." child(ren).<br/>"; 
    for($x = 0; $x < count($node->childNodes); $x++) 
    { 
    if($node->childNodes->item($x)->getAttribute("name") == $filename) 
    { 
     $target = $node->childNodes->item($x); 
     echo "Target found.<br/>"; 
    } 
    else 
    { 
     echo "Searching for target...<br/>"; 
    } 
    } 

    if($target->getAttribute("type") != "directory") 
    { 
    $fstored = "uploads/".$target->childNodes->item(0)->wholeText; 
    unlink($fstored); 
    } 

    $node->removeChild($target); 

    $file = fopen("structure.xml", "w"); 
    fwrite($file, $xmlDoc->saveXML()); 

} 

structure.xml:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<directory name="root" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="directory"> 
    <directory name="music" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="directory"> 
    <directory name="She" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="directory"> 
     <directory name="Chiptek" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="directory"> 
     <directory name="mp3" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="directory"> 
      <file name="intro.mp3" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/mpeg">intro.mp3</file> 
      <file name="music.mp3" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/mpeg">music.mp3</file> 
      <file name="supersonic.mp3" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/mpeg">supersonic.mp3</file> 
      <file name="memories.mp3" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/mpeg">memories.mp3</file> 
      <file name="chiptek.mp3" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/mpeg">chiptek.mp3</file> 
      <file name="intermission.mp3" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/mpeg">intermission.mp3</file> 
      <file name="kicks.mp3" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/mpeg">kicks.mp3</file> 
      <file name="1997.mp3" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/mpeg">1997.mp3</file> 
     </directory> 
     <directory name="ogg" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="directory"> 
      <file name="intro.ogg" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/ogg">intro.ogg</file> 
      <file name="music.ogg" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/ogg">music.ogg</file> 
      <file name="supersonic.ogg" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/ogg">supersonic.ogg</file> 
      <file name="memories.ogg" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/ogg">memories.ogg</file> 
      <file name="chiptek.ogg" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/ogg">chiptek.ogg</file> 
      <file name="intermission.ogg" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/ogg">intermission.ogg</file> 
      <file name="kicks.ogg" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/ogg">kicks.ogg</file> 
      <file name="1997.ogg" owner="elarsen" read="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" write="aclum,ahoffman,apavlowski,bvollmer,dpotts,drichardson,epiatt,jcantrell,jreeve,kdouglas,kjab,lbrewer,lholliday,mfriedman,norty,pmoore,rlongwell,scatlett,sketcherside,tperkins" type="audio/ogg">1997.ogg</file> 
     </directory> 
     </directory> 
    </directory> 
    </directory> 
    <directory name="test01" owner="elarsen" read="0" write="0" type="directory"/> 
    <directory name="test02" owner="elarsen" read="0" write="0" type="directory"/> 
    <directory name="test03" owner="elarsen" read="0" write="0" type="directory"/> 
</directory> 

*以上應該是一個XML文件的內容,但我無法弄清楚如何顯示它是這樣。如果有更多關於在stackoverflow上格式化xml的知識的人可以解決它,我會非常感激。

這也可能是看到負責創建一個名爲「快樂學華語」,「test02」目錄的代碼,而「TEST03」有用:

function processNewForm($dir, $dirName, $readPrivs, $writePrivs) 
{ 
    $readString = ""; 
    $writeString = ""; 
    $dirOwner = $_SESSION["user"]; 

    for($x = 0; $x < count($readPrivs); $x++) 
    { 
    $readString += $readPrivs[$x].","; 
    } 
    for($x = 0; $x < count($writePrivs); $x++) 
    { 
    $writeString += $writePrivs[$x].","; 
    } 

    $xmlDoc = new DOMDocument(); 

    $xmlDoc->load("structure.xml"); 
    $node = dirDOMNodeWritable($dir, $xmlDoc); 

    $newDir = $xmlDoc->createElement("directory"); 
    $newDir->setAttribute("name", $dirName); 
    $newDir->setAttribute("owner", $dirOwner); 
    $newDir->setAttribute("read", $readString); 
    $newDir->setAttribute("write", $writeString); 
    $newDir->setAttribute("type", "directory"); 

    $node->appendChild($newDir); 

    $file = fopen("structure.xml", "w"); 
    fwrite($file, $xmlDoc->saveXML()); 

} 

電流輸出看起來是這樣的:

Received delete request. 
Validating delete request... Request is valid. 
Processing delete request. 
Request to delete test03/ from /. 
Working directory has 1 child(ren). 
Searching for target... 

Notice: Undefined variable: target in E:\aepi\dev\fileshare.php on line 540 

Fatal error: Call to a member function getAttribute() on a non-object in E:\aepi\dev\fileshare.php on line 540 
+0

這個dirDOMNodeWritable()函數做了什麼? –

+0

它創建一個DOMNode,表示從$ xmlDoc中傳遞的XMLDocument傳遞給$ dir變量的目錄路徑,以便當我嘗試使用$ node修改$ xmlDoc的結構時,它不會崩潰。 – Eric

回答

11

PHP manual for count()

返回VAR元素的數量。如果var不是一個數組或實現了Countable接口的對象,則返回1。

DOMNode::$childNodesDOMNodeList對象。這不是Countable。它會一直返回一個(即使是空的)。使用它的length屬性來代替:

$count = $element->childNodes->length; 
+0

我現在覺得真的很愚蠢。我有點確信,當我實際上使用長度時,我在代碼中的其他地方使用了count()來達到此目的。謝謝。 – Eric

1

我猜你的childNodes包含文本節點以及XML標籤節點,因爲標籤之間有空白。這可能會導致您計劃的計數爲childNodes兩倍。在嘗試獲取其屬性之前,應該檢查nodeType以確保它不是文本節點。

可能在這裏:

for($x = 0; $x < count($node->childNodes); $x++) 
    { 
    // Verify that you're not working on a text node (type 3 TEXT_NODE) 
    if($node->nodeType != 3 && $node->childNodes->item($x)->getAttribute("name") == $filename) 
    { 
     $target = $node->childNodes->item($x); 
     echo "Target found.<br/>"; 
    } 
    else 
    { 
     echo "Searching for target...<br/>"; 
    } 
    } 
+0

對不起,我應該提到我只是爲了便於閱讀而將上述xml代碼中的空格。 structure.xml存在於服務器上,而不介入空白。此外,如果是這樣的話,它會報告**更多**孩子比我想要的更多,不是更少? – Eric

+0

我一定錯過了報告比預期的要少。抱歉。 –

+0

我想知道爲什麼我得到的兒童節點數是實際兒童數的兩倍。這篇文章幫助了我! – krjampani

相關問題