使用XmlReader读取XML文件时,是否从该文件中删除节点



我有一个脚本,它使用XMLReader:逐节点读取XML

$z = new XMLReader;
$z->open('xmlfile.xml');
$doc = new DOMDocument;
while ($z->read() && $z->name !== 'item');
while ($z->name === 'item')
{
$node = simplexml_import_dom($doc->importNode($z->expand(), true));
//I read the node here 
print_r($node);
//Here I want to delete it
//////////////////////////
//move to next node
$z->next('item');
}

我想在读取该节点后从XML文件中删除该节点,以避免在再次调用脚本时多次读取相同的数据。最好的方法是什么?我能在读文件的时候做吗?

我在其他地方找不到答案。

XMLReader有一个名为XMLWriter的合作伙伴。因此,对于大型XML文件,您可以使用XMLReader读取XML文件,同时使用XMLWriter将过滤/修改后的数据写入新文件。

将文件的一部分扩展到DOM中可以更容易地读取和修改该部分,但您需要使用XMLWriter将XML结构序列化到新文件中。

我将其功能(包括collapse()方法(实现到FluentDOM中。下面是一个用法示例:

$xml = <<<'XML'
<persons>
<person><name>Alice</name></person>
<person><name>Bob</name></person>
<person><name>Charlie</name></person>
</persons>
XML;
// Create the target writer and add the root element
$writer = new FluentDOMXMLWriter();
$writer->openUri('php://stdout');
$writer->setIndent(2);
$writer->startDocument();
$writer->startElement('persons');
// load the source into a reader
$reader = new FluentDOMXMLReader();
$reader->open('data://text/plain;base64,'.base64_encode($xml));
// iterate the person elements - the iterator expands them into a DOM element node
foreach (new FluentDOMXMLReaderSiblingIterator($reader, 'person') as $person) {
/** @var FluentDOMDOMElement $person */
// ignore "Bob"
if ($person('string(name)') !== 'Bob') {
// write expanded node to the output
$writer->collapse($person);
}
}
$writer->endElement();
$writer->endDocument();

输出:

<?xml version="1.0"?>
<persons>
<person>
<name>Alice</name>
</person>
<person>
<name>Charlie</name>
</person>
</persons>

在阅读文档时不能编辑文档。。至少没有大量混乱低效的代码。

最好的方法是:

1( 将整个文档读取到第二个DOMDocument对象中。

2( 当您从XMLReader输入流中逐个读取节点时,在DOMDocument中找到相应的节点,并在完成后将其删除。请注意,不要删除具有尚未审阅的子节点的节点。

3( 完成后,将新的DomDocument保存为新的文件名,并将其用作下一次编辑会话的输入源。

完成后,您将成为DomDocument操作方面的专家。

如果遇到问题,请提出新问题。

最新更新