не удается получить дочерний элемент xml с помощью curl_setopt

#php #xml #loops #oop #foreach

#php #xml #циклы #ооп #foreach

Вопрос:

Допустим, у меня есть XML-файл, подобный приведенному ниже:

 <objectlist>
    <objectcode>OP#0003</objectcode>
    <objectid>0001</objectid>
    <objecttype>Test object</objecttype>
    <object>
        <info>
            <id>001</id>
            <name>Some name</name>
            <value>5</value>
        </info>
        <properties>
            <shopdetails>
                <desciption>
                    <header>Test</header>
                    <text>This is some text about the object</text>
                </desciption>
                <price>4</price>
                <currency>Dollar</currency>
                <weight>500</weight>
                <gramSymbol>mg</gramSymbol>
            </shopdetails>
        </properties>
    </object>
</objectlist>
  

Как мне получить всю информацию из этого XML-файла с помощью curl_setopt() ? Я попробовал это с циклом foreach, но это не удалось. Он получает информацию только из: objectcode, object id и objecttype objecttype.
Мой скрипт может получать информацию только из дочерних узлов корня, но не из дочерних узлов дочерних узлов. Я использовал этот скрипт для своего проекта:

     <?php
Class xmlObject{    
    public function xml_From_URL() {
        require_once 'dbconnect.php'; 
        $config[CURLOPT_URL] = "http://localhost/example.xml";
        $config[CURLOPT_VERBOSE] = 0;
        $config[CURLOPT_SSLVERSION] = 3;
        $config[CURLOPT_SSL_VERIFYPEER] = FALSE;
        $config[CURLOPT_SSL_VERIFYHOST] = 2;
        $config[CURLOPT_FOLLOWLOCATION] = 0;
        $config[CURLOPT_HEADER] = 0;
        $config[CURLOPT_RETURNTRANSFER] = 1;
            //-- config section --//
        $tuCurl = curl_init();
        curl_setopt_array($tuCurl, $config);
        $data = curl_exec($tuCurl);
        $xml = simplexml_load_string($data);
            //-- Loops --//
                //-- 1 --//
        foreach($xml -> object as $row){
            $id = $row -> id;
            $name = $row -> name;
            $value = $row -> value;   
            echo("<b>Objects</b></br>");
            echo($id."<br>");
            echo($name."<br>");
            echo($value."<br>");
        }
                //-- 2 --//
        foreach ($xml -> description as $row) {
            $header = $row -> header;
            $text = $row -> text;
            echo("<b>description</b><br>");
            echo($header);
            echo($text);
        }
                //-- 3 --//
        foreach ($xml -> shopdetails as $row) {
            $header = $row -> price;
            $text = $row -> currency;
            $weight = $row -> weight;
            $gramsymbol = $row -> gramsymbol;    
            echo("<b>description</b><br>");
            echo($header);
            echo($text);
        }
        curl_close($tuCurl);
    }
}
?>
  

Ответ №1:

Вам просто нужно обновить свой PHP-код, который анализирует XML-данные — cURL предоставляет только XML-данные, не анализирует их. Вы используете simplexml_load_string() для создания SimpleXMLElement. Вам просто нужно получить доступ к свойствам немного по-другому.

Вместо того, чтобы обращаться id из $row вот так:

 $id = $row->id;
  

нам нужно получить доступ к узлу между <object> и <id> , т.е. <info>

 $id = $row->info->id;
  

И аналогично для других свойств. Кроме того, вы можете переместить curl_close($tuCurl); вверх сразу после вызова curl_exec , поскольку cURL не анализирует XML-данные, а simplexml. Вы можете увидеть это в действии (без выборки данных с помощью cURL) в этом примере phpFiddle. Для получения дополнительной информации обратитесь к документации PHP для элементов SimpleXML на PHP.net

 <?php
Class xmlObject{    
    public function xml_From_URL() {
        require_once 'dbconnect.php'; 
        $config[CURLOPT_URL] = "http://localhost/example.xml";
        $config[CURLOPT_VERBOSE] = 0;
        $config[CURLOPT_SSLVERSION] = 3;
        $config[CURLOPT_SSL_VERIFYPEER] = FALSE;
        $config[CURLOPT_SSL_VERIFYHOST] = 2;
        $config[CURLOPT_FOLLOWLOCATION] = 0;
        $config[CURLOPT_HEADER] = 0;
        $config[CURLOPT_RETURNTRANSFER] = 1;
        //-- config section --//
        $tuCurl = curl_init();
        curl_setopt_array($tuCurl, $config);
        $data = curl_exec($tuCurl);

        //now that we have set $data, we can close the cURL request
        curl_close($tuCurl);

        $xml = simplexml_load_string($data);

        foreach($xml -> object as $row){ 
            //access these properties from the info childnode  
            $id = $row->info->id;
            $name = $row->info->name;
            $value = $row->info->value;   
            echo("<b>Objects</b></br>");
            echo($id."<br>");
            echo($name."<br>");
            echo($value."<br>");
            //access these properties using the properties childnode
            $header = $row->properties->shopdetails->desciption->header;
            $text = $row->properties->shopdetails->desciption->text;
            echo("<b>description</b><br>");
            echo($header."<br>");
            echo($text."<br>");
        }
    }
}
?>
  

Комментарии:

1. Спасибо, что это сработало для реального скрипта, над которым я работаю.