2011-08-17 76 views
2

我有這個PHP代碼,它將一組節點添加到XML文件中。它完成了它應該做的大部分工作,它找到了添加的位置,但是沒有進行更新。XML更新PHP中的一組節點

我有這種結構的xml文件。

<COMMUNITIES> 
    <COMMUNITY ID="c001"> 
     <URLS> 
      <URL ID="u001"> 
       <NAME>Google.com</NAME> 
       <URL>http://www.google.com</URL> 
      </URL> 
     </URLS> 
    </COMMUNITY> 
</COMMUNITIES> 

正在對URLS節點進行更新。用戶點擊「添加URL」鏈接,然後像這樣將新的URL添加到此節點。

 <URL ID="u002"> 
      <NAME>Yahoo.com</NAME> 
      <URL>http://www.yahoo.com</URL> 
     </URL> 

如果URLS節點存在,我追加新的url節點。如果URLS節點不存在,我創建它,然後附加新的url節點。

沒有錯誤,似乎一切正常,但URLS節點是空的。這是PHP腳本。

function add_url($nodeid, $urlid, $urlname, $urllink) { 

$dom = new DOMDocument(); 
$dom->load('communities.xml'); 

$dom->formatOutput = true; 
$dom->preserveWhiteSpace = false; 

// get document element 

$xpath = new DOMXPath($dom); 
$nodes = $xpath->query("//COMMUNITY[@ID='$nodeid']"); 

if ($nodes->length) { 
    $node = $nodes->item(0); 

    $xurl = $dom->createElement("URL"); 
    $xurl->setAttribute("ID", $urlid); 

    $xuname  = $dom->createElement("NAME"); 
    $xunameText = $dom->createTextNode(mysql_escape_mimic($urlname)); 
    $xuname->appendChild($xunameText); 

    $xulink  = $dom->createElement("URL"); 
    $xulinkText = $dom->createTextNode(mysql_escape_mimic($urllink)); 
    $xulink->appendChild($xulinkText); 

    $xurl->appendChild($xuname); 
    $xurl->appendChild($xulink); 

    $xurls = $xpath->query("//COMMUNITY[@ID='$nodeid']/URLS"); 

    if ($xurls->length) { 
    } 
    else { 
     $xurls = $dom->createElement("URLS"); 
    } 

    $xurls->appendChild($xurl); 

    /* $node->appendChild($xurls); */ 

} 

$dom->save('communities.xml'); 
} 

我認爲問題在於我在追加URLS節點時已經存在。但是我注意到了這一點。我相信問題很簡單,但我是新手。我在網站上看了一下,沒有找到具體的情況。

編輯

  1. 刪除return語句if ($xurls->length)之前。

  2. 固定功能。

回答

0

問題是我試圖添加節點到已經在XML文件中的節點爲空。

而不是像這樣的數據的節點。

<URLS> 
    <URL ID="u001"> 
     <NAME>Google.com</NAME> 
    </URL> 
</URLS> 

我有一個這樣的節點。

<URLS/> 

常識說這應該不成問題。如果節點爲空,則appendChild應該只添加數據並將節點重寫爲。

<URLS> 
    <URL ID="u002"> 
     <NAME>Yahoo.com</NAME> 
    </URL> 
</URLS> 

這是PHP腳本的工作。你會注意到我創建了一個新節點,而不是追加到<URLS/>。我還將appendChild重新排序以從頂層節點開始,而不是先創建子節點,然後將一組節點添加到頂層節點。

function add_url($nodeid, $urlid, $urlname, $urllink) { 

$dom = new DOMDocument(); 
$dom->load('communities.xml'); 

$dom->formatOutput = true; 
$dom->preserveWhiteSpace = true; 

// get document element 

$xpath = new DOMXPath($dom); 
$nodes = $xpath->query("//COMMUNITY[@ID='$nodeid']"); 

if ($nodes->length) { 

    $node = $nodes->item(0); 

    $xurls = $xpath->query("//COMMUNITY[@ID='$nodeid']/URLS"); 


    if ($xurls->length) { 
    } 
    else { 
     $xurls = $dom->createElement("URLS"); 
     $node->appendChild($xurls); 
    } 

     $xurls = $dom->createElement("URLSC"); 
     $node->appendChild($xurls); 

    $xurl = $dom->createElement("URL"); 
    $xurl->setAttribute("ID", $urlid); 
    $xurls->appendChild($xurl); 

    $xuname  = $dom->createElement("NAME"); 
    $xunameText = $dom->createTextNode(mysql_escape_mimic($urlname)); 
    $xuname->appendChild($xunameText); 
    $xurl->appendChild($xuname); 

    $xulink  = $dom->createElement("URLC"); 
    $xulinkText = $dom->createTextNode(mysql_escape_mimic($urllink)); 
    $xulink->appendChild($xulinkText); 
    $xurl->appendChild($xulink); 

} 

$dom->save('communities.xml'); 
} 

所以我必須修改創建空節點<URLS/>的函數。我不應該在該函數中創建節點,而只是在add_url函數不存在時纔在此處創建它。

1

要調用return一半時的功能,在你實際上已經保存的更改 - 所以我猜發生了什麼事是你正在在內存中修改,但實際上沒有寫他們的文件...

+0

我添加了return語句來調試腳本。我刪除了它,並且不添加URL。 – user823527

+0

這個腳本有什麼問題? – user823527

+0

希望我可以幫忙,但我剛剛結束了它,老實說,我不知道。我真的從來沒有使用過PHP的DOM函數,所以我有點失落...... – DaveRandom