2012-11-05 140 views
1

我有这一小块XML,我希望在PHP中解析。 Works标签没问题,我可以解析所有的属性。我遇到的问题是Doesnt标签,它似乎是因为它具有我无法访问属性的文本内容。Parsed SimpleXMLElement缺少属性

<Export id="123" apples="pears"> 
    <Works foo="bar" id="234"/> 
    <Doesnt bar="foo" id="345">Stack Exchange</Doesnt> 
</Export> 

我运行下面的(很简单)的代码:

$plain = '<Export id="123" apples="pear....esnt></Export>'; // as above 
$sxe = simplexml_load_string($plain); 
$json = json_encode($sxe); 
$native = json_decode($json); 
print_r($sxe, true); 
print_r($native, true); 

而且我结束了以下的输出:

SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [id] => 123 
      [apples] => pears 
     ) 
    [Works] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [foo] => bar 
        [id] => 234 
       ) 
     ) 
    [Doesnt] => Stack Exchange 
) 

stdClass Object 
(
    [@attributes] => stdClass Object 
     (
      [id] => 123 
      [apples] => pears 
     ) 

    [Works] => stdClass Object 
     (
      [@attributes] => stdClass Object 
       (
        [foo] => bar 
        [id] => 234 
       ) 

     ) 

    [Doesnt] => Stack Exchange 
) 

正如你所看到的,SimpleXMLElement对象和stdClass对象都缺少<Doesnt>标记的所有属性。 是否有一些解决方法或替代方法来解决它们?

+2

绝不信任SimpleXml元素的'var_dump'或'print_r'输出。尝试访问属性,你会看到他们在那里。 – Gordon

+0

啊哈!我减少了我的例子,以保持简单,我将加入我的下一步(即json_encode) – Matthew

+2

嗨,对于那些想要关闭它的人,我保证这是一个真正的问题,并具有有效的可重用知识。 – Matthew

回答

2

正如@Gordon说,你不要用print_rvar_dump全貌:SimpleXMLElement Object有一些不同寻常的性质,因此这些功能倾销将不能正确地表示其结构。

不过,如果你曾用这个来代替:

$sxe = simplexml_load_string($plain); 
var_dump($sxe->Doesnt); 

...你会看到这些属性和它们的值不变。

但在输出密切关注:

object(SimpleXMLElement)[3] 
    public '@attributes' => 
    array (size=2) 
     'bar' => string 'foo' (length=3) 
     'id' => string '345' (length=3) 
    string 'Stack Exchange' (length=14) 

它有点不寻常,你不觉得,有string值只是挂在那里 - 没有任何相应的属性拥有它?但这正是直接转换会产生问题的原因。 JSON(就像它)处理简单的结构 - 对象和数组 - 这个结构在它们中都不能正确表示:你至少要引入一些额外的属性来存储文本内容。

尽管如此,这种方法似乎是有需求的(某种程度上),并且您绝对不会孤单:在PHP错误跟踪系统中,这里是一个开放ticket

+0

我的实际使用案例是将json_encode()与'SimpleXMLElement'一起使用,它遭受同样的问题。 – Matthew

+0

@Matt所以这里是XY问题......如果你在原始问题中提到过,它可能不会被关闭。无论如何,我可以引用你[这张票](https://bugs.php.net/bug.php?id=54632),它描述了问题的根源及其可能的解决方案。如果你愿意,我也可以用这个信息更新我的答案。 – raina77ow

+0

我不确定什么是“XY”问题,但是,现在我已经更新了问题,在顶部清楚了解我正在问什么。有什么办法让它重新开放吗?我认为这是一个完全有效的问题。 – Matthew