XML更新PHP中的一组节点

时间:2011-08-17 22:37:36

标签: php xml

我有这个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>

正在对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. if ($xurls->length)之前删除了return语句。

  2. 固定功能。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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函数不存在的情况下在此处创建它。