php xmlreader写入,PHP XMLReader读取,编辑Node,编写XMLWriter

这篇博客介绍了一种方法,通过XMLReader读取XML文件,使用XMLWriter在读取过程中添加或修改元素的'id'属性,并将更改写入新的XML文件。示例代码展示了如何处理这一过程,通过计数器为'ITEM'元素添加'id'属性,最后将新文件重命名为原始文件名。这种方法避免了同时使用XMLReader和XMLWriter导致的文件截断问题。
摘要由CSDN通过智能技术生成

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可以轻松处理所有其他节点和案例.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值