2

XML ファイルを編集していて、データベースからのデータを入力する必要があります。DOM は機能しますが、数百 MB に拡張することはできないため、現在、非常に大きな XML ファイルを書き込むことができる XMLReader と XMLWriter を使用しています。ここで、ノードを選択してそれに子を追加する必要がありますが、それを行う方法が見つかりません。誰か助けてもらえますか?

次の方法で、子を追加する必要があるノードを見つけることができます。

if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == 'data')
    {
        echo 'data was found';
        $data = $xmlReader->getAttribute('data');


    }

見つかったノードにノード/子を追加するにはどうすればよいですか? もう一度明確にするために、このコードはノードを読み取って見つけるので、これで完了です。見つかったノードを具体的にどのように変更するかが必要ですか? クラスのドキュメントを読んだ後にそれを行うメソッドが見つからなかった XMLWriter を使用する方法はありますか?

4

1 に答える 1

1

デフォルトで展開されたノードになります(質問にはありません)

$node = $xmlReader->expand();

XMLReader で編集することはできません (その名前からして理にかなっています)。ただし、新しい にインポートすると、特定のものをDOMNode 編集可能DOMDocumentにすることができます。

$doc  = new DOMDocument();
$node = $doc->importNode($node);

次に、DOM が提供する任意の DOM 操作を実行できます。たとえば、テキスト ノードを追加します。

$textNode = $doc->createTextNode('New Child TextNode added :)');
$node->appendChild($textNode);

操作に SimpleXML を使用する場合は、ノードを にインポートした後で、ノードを SimpleXML にインポートすることもできますDOMDocument

$xml = simplexml_import_dom($node);

上記の例では、xmlreader-iteratorsを使用して、より優れたインターフェイスを提供していますXMLReader

$reader  = new XMLReader();
$reader->open($xmlFile);

$elements = new XMLElementIterator($reader, 'data');
foreach ($elements as $element) 
{
    $node = $element->expand();
    $doc  = new DOMDocument();
    $node = $doc->importNode($node, true);
    $node->appendChild($doc->createTextNode('New Child TextNode added :)'));

    echo $doc->saveXML($node), "\n";
}

次の XML ドキュメントを使用します。

<xml>
    <data/>
    <boo>
        <blur>
            <data/>
            <data/>
        </blur>
    </boo>
    <data/>
</xml>

上記の小さなコード例では、次の出力が生成されます。

<data>New Child TextNode added :)</data>
<data>New Child TextNode added :)</data>
<data>New Child TextNode added :)</data>
<data>New Child TextNode added :)</data>
于 2013-04-05T22:45:31.143 に答える