Перемещение узла из одного XML-документа в другой с использованием SimpleXML - PullRequest
0 голосов
/ 07 сентября 2010

Я понимаю, что мой запрос невозможен с использованием только SimpleXML - это я и выяснил. Вот что я попробовал:

$newXML = simplexml_load_file($filePath); 
$domNewXML = dom_import_simplexml($newXML);
$domItem = dom_import_simplexml($items[$itemQty]);  <-- item I want to move
$domNewItem = $domItem->cloneNode(true);
$newNode = $domNewXML->importNode($domNewItem, true);
$domNewXML->getElementsByTagName('list')->item(0)->appendChild($newNode);

Я понимаю ошибки кода в строке 5, потому что importNode является функцией документа dom, а не элемента dom, но как мне получить документ dom для выполнения этого шага?

Правильно ли я поступаю?

В общей схеме у меня есть XML-файл, содержащий не менее 10 узлов, каждый день задание CRON проверяет наличие более 10 узлов, и если да, то оно должно перемещать узел из текущего файла в архивный файл. Я решил "переместить" узел, скопировав его в файл архива и удалив из исходного файла.

Спасибо за любую помощь!

1 Ответ

1 голос
/ 08 сентября 2010

Вы можете получить документ владельца через $ anyDOMNode-> ownerDocument


Возможно, нет необходимости клонировать и вставлять узлы в другой документ.Если вы разделите архив на: а) скелетный XML-документ и б) фрагмент XML, который включен в документ в качестве внешней сущности, этого будет достаточно, если вы просто добавите строковое представление узла XML в конец файла фрагмента.Например, как скелет

<?xml version="1.0"?>
<!DOCTYPE fooarchive [
  <!ENTITY entries SYSTEM "archive.fragment">
]>
<fooarchive>
  &entries;
</fooarchive>

, а затем скрипт php

$doc = new SimpleXMLElement('<a>
  <b>0</b><b>1</b><b>2</b><b>3</b>
  <b>4</b><b>5</b><b>6</b><b>7</b>
  <b>8</b><b>9</b><b>X</b><b>Y</b>
</a>');

$move = '';
for($i=10; $i<count($doc->b); $i++) {
  $move .= $doc->b[$i]->asXML();
}
file_put_contents('archive.fragment', $move, FILE_APPEND);

for($i=count($doc->b)-1; $i>9; $i--) {
  unset($doc->b[$i]);
}
echo $doc->asXML('current.xml');
...