0

我意识到仅使用 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 个节点,如果是,它应该将节点从当前文件移动到存档文件中. 我想我会通过将节点复制到存档文件并将其从原始文件中删除来“移动”节点。

谢谢你的帮助!

4

1 回答 1

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');
于 2010-09-07T21:27:18.990 回答