不能在XML节点中创建空值


Cannot create empty value in XML node

我试图将子元素附加到XML节点

$rel->appendChild($domtree->createElement('title',NULL));

我希望它像这样输出

<title></title>

但我得到了这个

<title/>

如何创建一个空值

您需要显式添加一个空文本节点:

$title = $domtree->createElement('title');
$title->appendChild($domtree->createTextNode(''));
$rel->appendChild($title);

createElement()的第二个参数是非标准的,我个人不使用它,因为它会产生像这样的稍微不直观的行为。

在我看来,您应该始终明确地创建文本节点。这样做的另一个原因是文本节点会自动正确地处理转义,而不像第二个非标准参数那样需要您手动转义文本数据。

为将来参考,以下是如何从数组(包括空元素)轻松构建xml的方法:

class Test {
    public function getTestXml()
    {
        $testElements = [
            'foo' => 'foo',
            'bar' => 'bar',
            'baz' => [
                'empty' => null,
            ],
        ];
        $xml = new 'DOMDocument('1.0', 'UTF-8');
        $test = $this->buildXmlNodeFromArray($xml, 'test', $testElements);
        $xml->appendChild($test);
        return $xml->saveXml();
    }
    /* Here's where all the magic happens */
    private function buildXmlNodeFromArray('DOMDocument $document, $nodeName, array $nodeElements)
    {
        $node = $document->createElement($nodeName);
        foreach ($nodeElements as $key => $value) {
            if (null === $value || '' === $value) {
                $emptyValue = $document->createTextNode('');
                $emptyElement = $document->createElement($key);
                $emptyElement->appendChild($emptyValue);
                $node->appendChild($emptyElement);
            } elseif (is_array($value)) {
                $subNode = $this->buildXmlNodeFromArray($document, $key, $value);
                $node->appendChild($subNode);
            } else {
                $node->appendChild($document->createElement($key, $value));
            }
        }
        return $node;
    }
}
$test = new Test();
echo $test->getTestXml();
结果:

<?xml version="1.0" encoding="UTF-8"?>
<test>
    <foo>foo</foo>
    <bar>bar</bar>
    <baz>
       <empty></empty>
    </baz>
</test>