使用SimpleXML将节点从一个XML文档移动到另一个XML文档

时间:2010-09-07 19:47:28

标签: php dom simplexml clonenode

我意识到我的请求不可能只使用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文档执行此步骤呢?

我能以正确的方式解决这个问题吗?

在宏观方案中,我有一个至少包含10个节点的XML文件,每天CRON作业检查是否有超过10个节点,如果有,它应该将节点从当前文件移动到存档文件。我想通过将节点复制到存档文件并将其从原始文件中删除来“移动”节点。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以通过$anyDOMNode->ownerDocument

获取所有者文档

也许没有必要克隆并将节点插入另一个文档。如果将存档拆分为a)骨架xml文档和b)作为外部实体包含在文档中的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');