在php中使用insertBefore方法

时间:2014-02-25 15:47:23

标签: php xml

我之前实际上曾经问过这个问题,但是有人说PC已经解决了我的解决方案,而且我再也无法让以前的解决方案起作用了。

我正在尝试向下面的XML添加一个新元素:

<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
    <comments>
        <comment>
            <date>20120509</date>
            <time>10:21:05</time>
            <name>Lucy</name>
            <text>Hello etc</text>
        </comment>
        <comment> ...etc

我正在使用的PHP代码是:

$xml = new DOMDocument('1.0', 'utf-8');
$xml->load(filename.xml);
$parent = $xml->firstChild;
$refnode = $parent->firstChild;

$new = $parent->insertBefore($xml->createElement('comment'), $refnode);

但是,这会在“data”标记后面添加一个新的“注释”,如果我尝试使用$new->addChild(tag, value)添加子项(例如“date”,“time”等...),我得到一个“未定义的方法”错误。我尝试了各种排列,但没有任何作用。

期望的结果将是:

<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
    <comments>
        *<comment>
            <date>20140225</date>
            <time>17:39:05</time>
            <name>Derek</name>
            <text>New comment text</text>
        </comment>*
        <comment>
            <date>20120509</date>
            <time>10:21:05</time>
            <name>Lucy</name>
            <text>Hello etc</text>
        </comment>
        <comment> ...etc

1 个答案:

答案 0 :(得分:0)

您的XML文件很可能包含您示例中的空白字符。这些被解释为文本节点,这使得firstChild无法获得您想要的那些元素之一。

您必须迭代孩子而获得第一个孩子,实际上是DOMElement。你也必须比你做得更深一层。请参阅附加的源代码,它输出您想要的结果。

<?php
$xml = new DOMDocument();
$xml->loadXML('<?xml version="1.0" encoding="UTF-8"?>
<data>
    <comments>
        <comment>
            <date>20120509</date>
            <time>10:21:05</time>
            <name>Lucy</name>
            <text>Hello etc</text>
        </comment>
    </comments>
</data>');
$parent = $xml->firstChild;
foreach ($parent->childNodes as $c) {
    if ($c instanceof DOMElement) {
        $refnode = $c;
        break;
    }
}
foreach ($refnode->childNodes as $c) {
    if ($c instanceof DOMElement) {
        $refnode2 = $c;
        break;
    }
}

$insert = $xml->createElement('comment', 'test');
$refnode->insertBefore($insert, $refnode2);
echo $xml->saveHTML();