2012-09-14 103 views
5

我有下面的XML文档在这里: 编辑:(参见下面的示例)PHP SimpleXML的属性丢失

我使用PHP/SimpleXML来它隐蔽的一个对象来阅读:

$xmlContent = file_get_contents($path . '/test.xml'); 
$tablesRaw = new SimpleXMLElement($xmlContent); 
echo '<pre>'; 
print_r($tablesRaw); 
echo '</pre>'; 

当我print_r我看到字段的属性,但可接受值的属性不显示。这里是原始XML(我需要的价值属性)的例子:

<acceptable-value value="0"> 
    Unknown 
</acceptable-value> 

这是我看到的时候我的print_r:

[acceptable-values] => SimpleXMLElement Object 
              (
               [acceptable-value] => Array 
                (
                 [0] => 
        Unknown 

                 [1] => 
        Invalid 

                 [2] => 
        Deleted 

                 [3] => 
        Valid/Good 

                 [4] => 
        Inactive 

                ) 

              ) 

任何线索,为什么属性没有显示?提前致谢。

编辑:请给一些XML的:

<field name="Address1Type" type="String"/> 
<field name="Address2Street1" type="String"/> 
<field name="Address2Street2" type="String"/> 
<field name="Address2Type" type="String"/> 
<field name="Address3Street1" type="String"/> 
<field name="Status" type="Integer" access="R"> 
      <acceptable-values> 
       <acceptable-value value="0"> 
        Unknown 
       </acceptable-value> 
       <acceptable-value value="1"> 
        Invalid 
       </acceptable-value> 
       <acceptable-value value="2"> 
        Deleted 
       </acceptable-value> 
       <acceptable-value value="3"> 
        Valid/Good 
       </acceptable-value> 
       <acceptable-value value="4"> 
        Inactive 
       </acceptable-value> 
      </acceptable-values> 
     </field> 
+0

你会复制/粘贴一些原始的xml代码,所以我不必下载它? – Norse

+0

是的,试图让一些显示 – joshmmo

+1

那里我们现在去显示 – joshmmo

回答

7

这里的简单答案是不要使用print_r()与SimpleXML对象。因为它们是非PHP数据的包装器,所以通常会显示“整个”对象的函数并不真正反映您正在查看的内容。

使用SimpleXML访问属性的方法是使用属性名称,就像它是一个数组键($node['attribute']);这是而不是意味着有一个数组在某处与该密钥,这是一个伪装的函数调用。

如果您想在编写SimpleXML代码时感受您正在查看的节点,请查看我写的this simplexml_dump() function(反馈欢迎)。

+0

不知道如果我做错了什么,但它看起来不适合我,你可以在这里看到我的代码/输出http://i46.tinypic.com/wnqti.jpg – joshmmo

+0

@joshmmo道歉,我倾向于跑带有Notices的PHP被压制,因为他们经常抱怨我很满意的事情。当我下一次登录到我的开发箱时,我会更新该函数不会提出该通知。然而,输出结果与预期的一样 - 它不会尝试缓冲整个结构,只是告诉您当前节点被称为“表”并包含57个名为“table”的子节点。'simplexml_dump($ tablesRaw-> children())'显示更有用的东西,或者确实是'simplexml_dump($ tablesRaw-> table [22] - > fields-> field [31] - > {'acceptable-values'} - >儿童())' – IMSoP

+0

非常好,我喜欢它。如果它可以扩大整个对象的话,这将是很好的,所以我可以一次看到它。 – joshmmo

0

首先,你必须得到SimpleXMLElement对象。在这种情况下:

$xmlContent = file_get_contents($path . '/test.xml'); 
$tablesRaw = new SimpleXMLElement($xmlContent); 
$elements = $tablesRaw->table[22]->fields->field[31]->{'acceptable-values'}->children(); 

现在,你可以遍历每个acceptable-value对象,并使用attributes()方法:

foreach($elements as $element) { 
    echo $element->attributes()->value . " "; 
    echo trim($element[0]) . "\n"; 
} 

有了您的XML,将打印:

0 Unknown 
1 Invalid 
2 Deleted 
3 Valid/Good 
4 Inactive 

一点也没有不依赖数组索引,因为对attributes()的调用获取元素的实际属性。并且->value获取名称为“value”的属性。