我在修改XML文件中的值时遇到困难,我有以下代码片段。 下面的XML片段是XML文件的一个非常简化的版本,我在运行代码时不断收到此错误:
Warning: Creating default object from empty value in updateXML.php
$doc = new DOMDocument();
$doc->load($vNewFile);
$vPayment = $doc->getElementsByTagName("Payment");
foreach ($vPayment AS $vPaymt) {
$vPaymt->Name->nodeValue = self::NAME;
}
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<Customer>
...
<Payment>
<Name></Name>
...
</Payment>
...
</Customer>
</Document>
非常感谢任何有关此问题的帮助,因为我很愚蠢,只是无法理解。
答案 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。