PHP:如何用XMLWriter替换现有的XML节点

时间:2013-04-04 21:31:54

标签: php xml large-files xmlreader xmlwriter

我正在编辑XML文件,需要使用数据库中的数据填充它。 DOM工作但它无法扩展到几百MB,所以我现在使用XMLReader和XMLWriter,它可以编写非常大的XML文件。现在,我需要选择一个节点并添加子节点,但我找不到方法来执行此操作,有人可以帮助我吗?

我可以通过以下方式找到我需要添加子节点的节点:

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


    }

我现在如何向找到的节点添加更多节点/子节点?再次澄清一下,此代码将读取并找到节点,以便完成。需要具体是如何修改找到的节点?有没有一种方法可以使用XMLWriter,在阅读完类文档之后我还没有找到一种方法呢?

1 个答案:

答案 0 :(得分: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进行操作,您也可以在将导入DOMDocument之后将节点导入SimpleXML

$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>