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