How to change the id attribute of a DomNode and save changes to the original XML File using XMLWriter again?
这不起作用.如果您使用XMLReader和XMLWriter同时对同一文件进行操作,则该文件将被编写器截断,并且读取器将吐出错误并停止工作.
但是,您可以对不同的文件进行操作.
所以你可以做的是使用XMLReader来读取文档,当你对它进行操作时,使用XMLWriter根据你读过的和偶尔修改的内容写入另一个文档.完成后,您可以将新写入的文件重命名为旧文件名.
例
对于一个XML文档(缩写为示例,XMLReader和XMLWriter自然而然地使用非常大的文档),像这样在你的问题之后建模了一下:
item #1
item #2
item #3
item #4
item #5
一个有效的代码示例是:
/*
* This file is part of the XMLReaderIterator package.
*
* Copyright (C) 2012, 2014 hakre
*
* Example: Write XML with XMLWriter while reading from XMLReader with XMLWriterIteration
*/
require('xmlreader-iterators.php'); // require XMLReaderIterator library
$xmlInputFile = 'data/dobs-items.xml';
$xmlOutputFile = 'php://output';
$reader = new XMLReader();
$reader->open($xmlInputFile);
$writer = new XMLWriter();
$writer->openUri($xmlOutputFile);
$iterator = new XMLWritingIteration($writer, $reader);
$writer->startDocument();
$itemsCount = 0;
$itemCount = 0;
foreach ($iterator as $node) {
$isElement = $node->nodeType === XMLReader::ELEMENT;
if ($isElement && $node->name === 'ITEMS') {
// increase counter for elements and reset counter
$itemsCount++;
$itemCount = 0;
}
if ($isElement && $node->name === 'ITEM') {
// increase counter and insert "id" attribute
$itemCount++;
$writer->startElement($node->name);
$writer->writeAttribute('id', $itemsCount . "-" . $itemCount);
if ($node->isEmptyElement) {
$writer->endElement();
}
} else {
// handle everything else
$iterator->write();
}
}
$writer->endDocument();
然后输出(标准输出示例,可以使用任何有效的PHP文件名):
item #1
item #2
item #3
item #4
item #5
如此示例所示,id属性是根据不同计数器变量的编号添加的.
由于$iterator-> write(),XMLWritingIteration可以轻松处理所有其他节点和案例.