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);

importNode は dom 要素ではなく dom ドキュメントの関数であるため、コードの 5 行目でエラーが発生していることに気付きましたが、どうすれば 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 に答える