2011-08-17 73 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