我意识到我的请求不可能只使用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个节点,如果有,它应该将节点从当前文件移动到存档文件。我想通过将节点复制到存档文件并将其从原始文件中删除来“移动”节点。
感谢您的帮助!
答案 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');