我正在编辑XML文件,需要使用数据库中的数据填充它。 DOM工作但它无法扩展到几百MB,所以我现在使用XMLReader和XMLWriter,它可以编写非常大的XML文件。现在,我需要选择一个节点并添加子节点,但我找不到方法来执行此操作,有人可以帮助我吗?
我可以通过以下方式找到我需要添加子节点的节点:
if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == 'data')
{
echo 'data was found';
$data = $xmlReader->getAttribute('data');
}
我现在如何向找到的节点添加更多节点/子节点?再次澄清一下,此代码将读取并找到节点,以便完成。需要具体是如何修改找到的节点?有没有一种方法可以使用XMLWriter,在阅读完类文档之后我还没有找到一种方法呢?
答案 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>