何が起こっているのか理解できたと思います。次のようなコードが与えられた場合:
$xml = new SimpleXMLElement('<xml></xml>');
$xml->addChild('node','value');
print_r($xml);
$xml = new SimpleXMLElement('<xml></xml>');
$xml->addChild('node','');
print_r($xml);
$xml = new SimpleXMLElement('<xml></xml>');
$xml->addChild('node');
print_r($xml);
出力は次のとおりです。
SimpleXMLElement Object
(
[node] => value
)
SimpleXMLElement Object
(
[node] => SimpleXMLElement Object
(
[0] =>
)
)
SimpleXMLElement Object
(
[node] => SimpleXMLElement Object
(
)
)
したがって、#2 の場合に空の要素が作成されないようにするには (つまり、2 番目の引数が空の文字列になるかどうかわからない場合)、次のようにすることができます。
$mystery_string = '';
$xml = new SimpleXMLElement('<xml></xml>');
if (preg_match('#\S#', $mystery_string)) // Checks for non-whitespace character
$xml->addChild('node', $mystery_string);
else
$xml->addChild('node');
print_r($xml);
echo "\nOr in JSON:\n";
echo json_encode($xml);
出力するには:
SimpleXMLElement Object
(
[node] => SimpleXMLElement Object
(
)
)
Or in JSON:
{"node":{}}
それはあなたが望むものですか?
個人的には、私は SimpleXML を使用したことがありません。これは、この種の奇妙な動作のためだけでなく、まだ主要な開発段階にあり、PHP5 では DOM 操作に必要なメソッド (deleteChild、replaceChild など) の 2/3 が欠落しています。 .
私は DOMDocument を使用します (これは libxml2 へのインターフェースであるため、標準化され、高速で機能が完備されています)。