了解 PHP 中 SimpleXMLElement 对象的形成

Understanding the formation of SimpleXMLElement object in PHP

我很想知道一个 SimpleXMLElement 对象是如何从 XML 文档在 PHP 中形成的,但我认为这个过程中可能有一些未知的东西对我来说。

当我们遍历 PHP 中的一个对象时,public 属性被迭代。因此,如果第一个 属性 是一个数组,那么我们应该在第一个循环中需要另一个循环来迭代它,但是,SimpleXMLElement 对象似乎并非如此。例如看这个对象:

  object(SimpleXMLElement)#1 (1) {
  ["user"]=>
  array(5) {
    [0]=>
    object(SimpleXMLElement)#2 (3) {
      ["firstname"]=>
      string(6) "Sheila"
      ["surname"]=>
      string(5) "Green"
      ["contact"]=>
      object(SimpleXMLElement)#7 (3) {
        ["phone"]=>
        string(9) "1234 1234"
        ["url"]=>
        string(18) "http://example.com"
        ["email"]=>
        string(18) "pamela@example.com"
      }
    }
    [1]=>
    object(SimpleXMLElement)#3 (3) {
      ["firstname"]=>
      string(5) "Bruce"
      ["surname"]=>
      string(5) "Smith"
      .
      .
      .

它包含一个 "user" 属性,其中有一个数组(包含 5 个元素)。所以当我们遍历这个对象时,我们应该得到这个错误:

Notice: Array to string conversion in ...

我已经在这段代码中对此进行了测试:

$var = (object)array(
   'user'=>['joe','mia'],
);

现在这个循环给出了我刚才提到的错误:

foreach ($test as $property => $val){
    echo $property.':'.$val.'<br>';
}
循环中的

$val是数组,不能回显。使用print_r($val)来显示它的价值。

foreach ($test as $property => $val){
    echo $property.':';
    print_r($val);
    echo '<br>';
}

了解基本的 SimpleXML 处理是如何工作的是值得的,试图绕过对象的内部结构是无济于事的。尝试访问元素时,使用 ->elementName

您可能拥有的数据的简单模型...

$data = "<base>
    <user>
        <firstname>Sheila</firstname>
        <surname>Green</surname>
        <contact>
            <phone>1234 1234</phone>
        </contact>
    </user>
</base>";

如果您想打印出 <user> 下的所有元素,那么您可以使用 foreach() 并使用 ->user->children(),如...

$xml = simplexml_load_string($data);
//print_r($xml);

foreach ( $xml->user->children() as $tag => $value )  {
    echo $tag."-".$value.PHP_EOL;
}

哪个输出...

firstname-Sheila
surname-Green
contact-

由于联系人本身就是一个结构,您可以添加

if ( $value->count() > 0 )  {
    foreach ( $value->children() as $tag => $sub )  {
        echo $tag."-".$sub.PHP_EOL;
    }
}

允许您打印出来。