使用XmlReader读取XML文件时从XML文件中删除节点?

时间:2018-11-08 23:45:19

标签: php xml xmlreader

我有一个脚本,该脚本使用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文件后将其删除,以避免在再次调用脚本时多次读取相同的数据。最好的方法是什么?读取文件时我能做到吗?

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

2 个答案:

答案 0 :(得分:2)

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 \FluentDOM\XMLWriter();
$writer->openUri('php://stdout');
$writer->setIndent(2);
$writer->startDocument();
$writer->startElement('persons');

// load the source into a reader
$reader = new \FluentDOM\XMLReader();
$reader->open('data://text/plain;base64,'.base64_encode($xml));

// iterate the person elements - the iterator expands them into a DOM element node
foreach (new \FluentDOM\XMLReader\SiblingIterator($reader, 'person') as $person) {
  /** @var \FluentDOM\DOM\Element $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 :(得分:1)

在阅读文档的同时,您无法编辑文档。至少没有很多混乱且效率低下的代码。

最好的方法是:

1)将整个文档读入第二个DOMDocument对象。

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

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

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

如果遇到问题,请发布新问题。