XML / DOM - 无法更新空节点值

时间:2015-02-24 10:08:42

标签: php xml dom

我在修改XML文件中的值时遇到困难,我有以下代码片段。 下面的XML片段是XML文件的一个非常简化的版本,我在运行代码时不断收到此错误:

错误

Warning: Creating default object from empty value in updateXML.php

PHP

$doc = new DOMDocument();
$doc->load($vNewFile);
$vPayment = $doc->getElementsByTagName("Payment");
foreach ($vPayment AS $vPaymt) {
    $vPaymt->Name->nodeValue = self::NAME;
}

XML

<?xml version="1.0" encoding="UTF-8"?>
<Document>
    <Customer>
        ...
        <Payment>
            <Name></Name>
            ...
        </Payment>
        ...
    </Customer>
</Document>

非常感谢任何有关此问题的帮助,因为我很愚蠢,只是无法理解。

1 个答案:

答案 0 :(得分:1)

问题是:

$vPaymt->Name->nodeValue = self::NAME;

它与DOM无关。这是另一个重现错误消息的来源:

$o = new stdClass();
$o->PropertyName->SubPropertyName = 23;

消息:

Warning: Creating default object from empty value in /tmp/ex... on line 4

$vPaymt是一个对象(DOMElement),但$vPaymt->Name是一个不存在的属性。您可以通过编写它的属性将该非现有属性用作对象。 PHP将其初始化为默认对象并向您发出警告。

DOM没有子元素的自动映射(如SimpleXML)。您应该使用XPath来获取Name节点。

$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<Document>
    <Customer>
        <Payment>
            <Name></Name>
        </Payment>
    </Customer>
</Document>
XML;

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);

foreach ($xpath->evaluate('//Payment/Name') as $node) {
  $node->nodeValue = '';
  $node->appendChild($dom->createTextNode('FOO'));
}

echo $dom->saveXml();

输出:

<?xml version="1.0" encoding="UTF-8"?>
<Document>
    <Customer>
        <Payment>
            <Name>FOO</Name>
        </Payment>
    </Customer>
</Document>

警告!

永远不要用变量中的字符串写DOMNode :: $ nodeValue。它没有完全逃脱提供的字符串。设置一个空字符串很好(没有要转义的字符)。始终创建一个文本节点并附加它以避免损坏XML。