子要素を XML ノードに追加しようとしています
$rel->appendChild($domtree->createElement('title',NULL));
このように出力したい
<title></title>
しかし、私は代わりにこれを手に入れました
<title/>
空の値でこれを作成する方法は?
子要素を XML ノードに追加しようとしています
$rel->appendChild($domtree->createElement('title',NULL));
このように出力したい
<title></title>
しかし、私は代わりにこれを手に入れました
<title/>
空の値でこれを作成する方法は?
空のテキスト ノードを明示的に追加する必要があります。
$title = $domtree->createElement('title');
$title->appendChild($domtree->createTextNode(''));
$rel->appendChild($title);
の 2 番目の引数createElement()
は非標準であり、個人的には使用しません。
私の意見では、常にテキストノードを明示的に作成する必要があります。これを行うもう 1 つの理由は、テキスト データを手動でエスケープする必要がある非標準の 2 番目の引数とは異なり、テキスト ノードが自動的にエスケープを正しく処理することです。
今後の参考のために、配列 (空の要素を含む) から 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>