#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. Спасибо, что это сработало для реального скрипта, над которым я работаю.