XML在PHP中更新一组节点


XML update a set of nodes in PHP

我有这段PHP代码,它将一组节点添加到XML文件中。它做了它应该做的大部分事情,它找到在哪里添加,但然后它不进行更新。

我有一个这样结构的xml文件。

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

正在对url节点进行更新。用户点击"添加URL"链接,我像这样将新URL添加到该节点。

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

如果url节点存在,则追加新的url节点。如果url节点不存在,则创建它,然后附加新的url节点。

没有错误,似乎一切正常,但url节点为空。下面是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');
}

我认为问题是我在url节点已经存在的情况下追加了它。但是我把这行注释掉了。我相信这个问题很简单,但我是新手。我在网站上找了一下,没有找到那个具体的情况。

编辑

  1. 删除if ($xurls->length)前的返回语句。

  2. 固定函数。

在您实际保存更改之前,您正在调用return到函数的一半-所以我猜正在发生的事情是您正在内存中进行修改,但实际上并没有将它们写入文件…

问题是,我试图向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函数中创建它只有当它不存在的时候。