Мне кажется, я понял, что происходит. Данный код выглядит так:
$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 пустой элемент не создавался (т.е. если вы не знаете, будет ли второй аргумент пустой строкой или нет), вы можете просто сделать что-то вроде это:
$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 отсутствует, как 2/3 методов, необходимых для манипулирования DOM (например, deleteChild replaceChild и т. д.).
Я использую DOMDocument (который стандартизирован, быстр и функционален, поскольку это интерфейс к libxml2).