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

XML/DOM - Can't update empty node value

我在修改 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>

非常感谢任何对此问题的帮助,因为我很笨,只是想不通。

问题是:

$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 是一个对象(一个 DOM 元素),但 $vPaymt->Name 是一个不存在的 属性。您可以通过编写一个 属性 来使用那个不存在的 属性 作为一个对象。 PHP 将其初始化为默认对象并警告您。

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

$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.