PHP SimpleXML :: addChild,带有空字符串 - 冗余节点

时间:2008-10-29 15:47:57

标签: php simplexml addchild

使用空字符串调用addChild作为值(或者甚至使用空格)似乎会导致在节点内添加冗余的SimpleXml节点,而不是仅添加没有值的节点。

以下是对所发生情况的快速演示:

[description] => !4jh5jh1uio4jh5ij14j34io5j!

这里有一个空字符串:

[description] => SimpleXMLElement Object ( [0] => ) 

我现在使用的解决方法非常糟糕 - 我正在对最终的JSON进行str_replace替换!4jh5jh1uio4jh5ij14j34io5j!用空字符串。呸。也许目前唯一的答案是“向simplexml提交错误报告”......

有没有人有更好的解决方案?

4 个答案:

答案 0 :(得分:1)

我想我弄清楚发生了什么。给出这样的代码:

$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中缺少需要进行DOM操作的2/3方法(如deleteChild, replaceChild等)。

我使用DOMDocument(标准化,快速且功能齐全,因为它是libxml2的接口)。

答案 1 :(得分:1)

使用SimpleXML,如果使用print_r()或var_dump(),serialize()或类似内容,则得到的内容与对象内部存储的内容不对应。它是一个“神奇”的对象,它超越了PHP与其内容交互的方式。

只能使用AsXML()获得元素的真实表示。

当print_r()之类的东西遍历SimpleXML元素或您使用 - &gt;访问其属性时运算符,你得到一个munged版本的对象。这个munged版本允许你做一些事情,比如“echo $ xml-&gt; surname”或$ xml-&gt; names [1],好像它确实将这些作为属性,但是与包含在其中的真正XML分开:在munged表示元素不一定按顺序排列,名称为PHP保留字(如“var”)的元素不作为属性显示,但可以使用$ xml [“var”]等代码访问 - 就像对象是一个关联数组。在多个兄弟元素具有相同名称的情况下,它们呈现为数组。我想由于某种原因,空字符串也会像数组一样呈现。但是,当使用AsXML()输出时,您将获得真实的表示。

答案 2 :(得分:0)

也许我没有正确理解这个问题但是,在我看来,当你使用addChild方法时,你需要有一个字符串作为节点名称的参数,而不管它是什么内容。节点。值(第二个参数)是可选的,可以留空以添加和清空节点。

如果有帮助,请告诉我。

答案 3 :(得分:0)

我已经创建了一个Xml库,它扩展了simpleXml对象,以包含DOMDocument中存在的所有功能,但缺少SimpleXml的接口(因为这两个函数与相同的底层libxml2对象进行交互--by参考)。它还有一些细节,如AsArray()或AsJson(),以其中一种格式输出你的对象。

我刚刚更新了库,以便在输出JSON时按预期工作。您可以执行以下操作:

$xml = new bXml('<xml></xml>');
$xml->addChild('node', '');
$json_w_root = $xml->asJson(); // is { 'xml': {'node':'' } }
$json = $xml->children()->asJson(); // is { 'node' : '' } as expected.

图书馆托管在http://code.google.com/p/blibrary/

的Google代码上