Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何不依赖有序XML获取特定属性的值_Php_Xml - Fatal编程技术网

Php 如何不依赖有序XML获取特定属性的值

Php 如何不依赖有序XML获取特定属性的值,php,xml,Php,Xml,给定以下XML: $test = '<response> <string key="status">success</string> <string key="count">3</string> <array key="results"> <array key="1"> <string key="content">Message content 1</strin

给定以下XML:

$test = '<response>
  <string key="status">success</string>
  <string key="count">3</string>
  <array key="results">
    <array key="1">
       <string key="content">Message content 1</string>
       <string key="garbage">I_dont_care</string>
       <string key="sender_id">100</string>
       <string key="more_garbage">more_stuffs</string>
    </array>
    <array key="2">
       <string key="content">Message content 2</string>
       <string key="garbage">I_dont_care</string>
       <string key="sender_id">200</string>
       <string key="more_garbage">more_stuffs</string>
    </array>
    <array key="3">
       <string key="content">Message content 3</string>
       <string key="garbage">I_dont_care</string>
       <string key="sender_id">300</string>
       <string key="more_garbage">more_stuffs</string>
    </array>
  </array>
</response>';
因为我过于依赖返回的XML的顺序($message->string[1]和$message->string[0])。我的问题是,在不依赖XML排序的情况下,响应这些属性值的正确方法是什么


我知道xPath,并且有一个工作示例,但它看起来像一碗意大利面代码,如果xPath是答案,我希望有一个工作示例。

您也可以访问XML节点的属性:

$status = $xml->string[0];
if($status == 'success') {
    foreach($xml->array[0] as $message) {
        foreach($message->string as $string){
            foreach($string->attributes() as $attribute){
                switch($attribute){
                    case 'sender':
                        echo 'Sender ID:'.(string)$string;
                    break;
                    case 'content':
                        echo 'Message Content:'.(string)$string;
                    break;
                }
            }
        }
    }
}

是的,但是如果状态返回为第2、第3、第n个对象,则第一行将失败。我希望学习如何重新编写代码,这样我就不必依赖于XML是如何排序的,因为我接收的数据是不断变化的。您仍然可以迭代第一个节点的属性。。
Sender ID: 100
Message content: Message content 1
Sender ID: 200
Message content: Message content 2
Sender ID: 300
Message content: Message content 2
$status = $xml->string[0];
if($status == 'success') {
    foreach($xml->array[0] as $message) {
        foreach($message->string as $string){
            foreach($string->attributes() as $attribute){
                switch($attribute){
                    case 'sender':
                        echo 'Sender ID:'.(string)$string;
                    break;
                    case 'content':
                        echo 'Message Content:'.(string)$string;
                    break;
                }
            }
        }
    }
}