Переименование узла XML DOM в PHP - PullRequest
0 голосов
/ 03 сентября 2011

Как переименовать узел XML в DOMDocument? Я хочу сделать резервную копию узла в файле XML перед записью нового узла. У меня есть этот код, где я хочу переименовать узел URLS в URLS_BACKUP.

function backup_urls( $nodeid ) {

$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) {
   /* rename URLS to URLS_BACKUP */

   }

}

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

Файл XML имеет такую ​​структуру.

<?xml version="1.0" encoding="ISO-8859-1"?>
<COMMUNITIES>
 <COMMUNITY ID="c000002">
  <NAME>ID000002</NAME>
  <TOP>192</TOP>
  <LEFT>297</LEFT>
  <WIDTH>150</WIDTH>
  <HEIGHT>150</HEIGHT>
  <URLS>
     <URL ID="u000002">
         <NAME>Facebook.com</NAME>
         <URLC>http://www.facebook.com</URLC>
     </URL>
  </URLS>
 </COMMUNITY>
</COMMUNITIES>

Спасибо.

Ответы [ 3 ]

6 голосов
/ 20 февраля 2012

вы прочитали весь список XML-файла с помощью fopen и использовали метод str_replace ()

$ handle = fopen ('communities.xml', 'r');
while (! feof ($ handle))
{
       $ buffer = fgets ($ handle, 4012);
       $ buffer = str_replace ("URLS", "URLS_BACKUP", $ buffer);
}
fclose ($ handle);
$ dom-> save ('communities.xml');
2 голосов
/ 24 февраля 2015

Невозможно переименовать узел в DOM.Строковые функции могут работать, но лучшее решение - создать новый узел и заменить старый.

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);

$nodeId = 'c000002'; 
$nodes = $xpath->evaluate("//COMMUNITY[@ID='$nodeid']/URLS");

// we change the document, iterate the nodes backwards
for ($i = $nodes->length - 1; $i >= 0; $i--) {
  $node = $nodes->item($i);
  // create the new node
  $newNode = $dom->createElement('URL_BACKUP');
  // copy all children to the new node
  foreach ($node->childNodes as $childNode) {
    $newNode->appendChild($childNode->cloneNode(TRUE));
  }
  // replace the node
  $node->parentNode->replaceChild($newNode, $node);
}

echo $dom->saveXml();
0 голосов
/ 28 марта 2018

Зная, что это невозможно, вот более простая функция для переименования тега после сохранения файла:

/**
 * renames a word in a file
 *
 * @param string $xml_path
 * @param string $orig word to rename
 * @param string $new new word
 * @return void
 */
public function renameNode($xml_path,$orig,$new)
{
    $str=file_get_contents($xml_path);
    $str=str_replace($orig, $new ,$str);
    file_put_contents($xml_path, $str);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...