【发布时间】:2010-12-19 16:12:02
【问题描述】:
基本上我想要做的是使用 PHP 打开一个 xml 文件并使用 php 编辑它,现在我可以使用 fopen() 函数来完成。 然而我的问题是我想将文本附加到文档的中间。所以假设 xml 文件有 10 行,我想在最后一行 (10) 之前附加一些内容,所以现在它将是 11 行。这可能吗。谢谢
【问题讨论】:
基本上我想要做的是使用 PHP 打开一个 xml 文件并使用 php 编辑它,现在我可以使用 fopen() 函数来完成。 然而我的问题是我想将文本附加到文档的中间。所以假设 xml 文件有 10 行,我想在最后一行 (10) 之前附加一些内容,所以现在它将是 11 行。这可能吗。谢谢
【问题讨论】:
根据该文件的大小,您可能会这样做:
$lines = array();
$fp = fopen('file.xml','r');
while (!feof($fp))
$lines[] = trim(fgets($fp));
fclose($fp);
array_splice($lines, 9, 0, array('newline1','newline2',...));
$new_content = implode("\n", $lines);
不过,您之后仍需要重新验证 XML 语法...
【讨论】:
如果您希望能够从中间修改文件,请使用c+ 打开模式:
$fp = fopen('test.txt', 'c+');
for ($i=0;$i<5;$i++) {
fgets($fp);
}
fwrite($fp, "foo\n");
fclose($fp);
上面将在第五行写入“foo”,而不必完全读取文件。
但是,如果您要修改 XML 文档,最好使用 DOM 解析器:
$dom = new DOMDocument;
$dom->load('myfile.xml');
$linenum = 5;
$newNode = $dom->createElement('hello', 'world');
$element = $dom->firstChild->firstChild; // skips the root node
while ($element) {
if ($element->getLineNo() == $linenum) {
$element->parentNode->insertBefore($newNode, $element);
break;
}
$element = $element->nextSibling;
}
echo $dom->saveXML();
当然,上面的代码取决于实际的 XML 文档结构。但是,$element->getLineNo() 是这里的关键。
【讨论】: