Вот ломаю голову над следующим вопросом. У меня есть три разных страницы, которые пользуются одним и тем же wsdl . Они писались на webdev2 в Политехе. А дома на компе у меня стоит WampServer, который использует php5. И самое странное, что на двух из страниц парсер работает, а на третьей не работает. И никак не пойму почему.
На одной из рабочих страниц:
$client = new SoapClient('http://www.webservicex.com/globalweather.asmx?WSDL');
$params['CountryName']='';
$result = $client->GetCitiesByCountry($params);
//print_r ($result);
//grab the xml and put all the values into an array called $vals
$myxml=$result->GetCitiesByCountryResult;
$p=xml_parser_create();
xml_parse_into_struct($p,$myxml,$vals);
xml_parser_free($p);
print_r($vals);
Где print_r($vals); показывает, что всю дату сохранил.
А на не рабочей вот что:
// create a new soap client
$client = new SoapClient('http://www.webservicex.com/globalweather.asmx?WSDL');
// the client can now access the wsdl and discover the operations, parameters, data types and responses
// set up the parameters in an associative array
$params = array();
$params['CityName']='Christchurch';
$params['CountryName']='New Zealand';
// use the client to run the required operation and receive a response
$result = $client->GetWeather($params);
print ( "<br>") ;
print ( "The message that was sent to the server was:<br>") ;
print ("<pre>");
print ("Request:<br />".htmlspecialchars($client->__getLastRequest() ) ."<br />");
print ("</pre>");
print ( "The result that was returned from the server was<br>") ;
print ( "<pre>") ;
print "Response:<br />".htmlspecialchars($client->__getLastResponse())."<br />";
print ( "</pre>") ;
// print_r is a useful printing function. It prints human -readable information about a variable
print_r($result);
print "<br />";
$myxml=$result->GetWeatherResult;
$p = xml_parser_create();
xml_parse_into_struct($p, $myxml, $vals);
xml_parser_free($p);
print_r($vals);
print "<br />";
Хотя это прекрасно работало в webdev2. А мне дома единственное что показывает print_r($vals) - это слово "Array()" и больше ничего. $myxml - показывает всю дату из $result - так что в myxml дата переходит. А вот аррей её не берёт, почему так? И что мне с этим делать?
Заранее благодарю.
Алина.
Спустя 14 минут, 37 секунд (22.06.2011 - 07:57) bulgakov написал(а):
Я не совсем хорошо разбираюсь с xml но на php.net вот что написано про функцию xml_parse_into_struct():
Description
int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )
This function parses an XML string into 2 parallel array structures, one (index) containing pointers to the location of the appropriate values in the values array. These last two parameters must be passed by reference.
То есть массив там должен передаваться по ссылке, может быть это вам поможет? Попробуйте передать $vals по ссылке предварительно создав пустой массив.
Description
int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )
This function parses an XML string into 2 parallel array structures, one (index) containing pointers to the location of the appropriate values in the values array. These last two parameters must be passed by reference.
То есть массив там должен передаваться по ссылке, может быть это вам поможет? Попробуйте передать $vals по ссылке предварительно создав пустой массив.
Спустя 15 минут, 34 секунды (22.06.2011 - 08:13) Widunder написал(а):
Вы это имеете ввиду?
Всё равно выдаёт пустой массив, потому что как раз xml_parse_into_struct($p, $myxml, $values); почему-то борохлит?! Когда на остальных страницах всё работает. И по-моей, может быть и женской логике, но между рабочими и не рабочей страницей всё практически идентично.
Массив почему-то получается пустым, когда парсер создан и myxml не пустое.
$myxml=$result->GetWeatherResult;
$vals = array();
$p=xml_parser_create();
xml_parse_into_struct($p, $myxml, $values);
xml_parser_free($p);
$vals[] = $values;
print_r($vals);
print "<br />";
Всё равно выдаёт пустой массив, потому что как раз xml_parse_into_struct($p, $myxml, $values); почему-то борохлит?! Когда на остальных страницах всё работает. И по-моей, может быть и женской логике, но между рабочими и не рабочей страницей всё практически идентично.
Массив почему-то получается пустым, когда парсер создан и myxml не пустое.
Спустя 9 минут, 57 секунд (22.06.2011 - 08:23) linker написал(а):
Попробуй SimpleXML или DOM.
Спустя 2 минуты, 30 секунд (22.06.2011 - 08:25) Widunder написал(а):
А это как? Нас такому не учили
Спустя 10 минут, 59 секунд (22.06.2011 - 08:36) bulgakov написал(а):
SimpleXML больше подходит для чтения xml файлов, работает по очень простому принципу, он преобразует xml файл или строку который вы ему дадите в объект, где все элементы xml файла превращаются в свойства этого объекта, например:
$xmlstr = <<<XML // наша xml строка
<?xml version='1.0' standalone='yes'?>
<movies>
<movie>
<title>PHP: Behind the Parser</title>
<characters>
<character>
<name>Ms. Coder</name>
<actor>Onlivia Actora</actor>
</character>
<character>
<name>Mr. Coder</name>
<actor>El ActУr</actor>
</character>
</characters>
<plot>
So, this language. It's like, a programming language. Or is it a
scripting language? All is revealed in this thrilling horror spoof
of a documentary.
</plot>
<great-lines>
<line>PHP solves all my web problems</line>
</great-lines>
<rating type="thumbs">7</rating>
<rating type="stars">5</rating>
</movie>
</movies>
XML;
$xml = new SimpleXMLElement($xmlstr); создаем объект simplexml в конструктор класса передаем нашу xml строку или если надо файл
var_dump($xml); // что бы ориентироваться можете посмотреть вывод var_dump()
echo $xml->movie[0]->plot; // а здесь уже доступ к эелементам xml как к свойствам объекта
Спустя 12 минут, 12 секунд (22.06.2011 - 08:48) Widunder написал(а):
Хм, никогда этого не пробовала. Написала вот так:
Вылезли кучи ошибок:
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : Document labelled UTF-16 but has UTF-8 content in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 40
Call Stack
# Time Memory Function Location
1 0.0008 384112 {main}( ) ..\weather1.php:0
2 1.1302 405392 SimpleXMLElement->__construct( ) ..\weather1.php:40
( ! ) Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: <?xml version="1.0" encoding="utf-16"?> in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 40
Call Stack
# Time Memory Function Location
1 0.0008 384112 {main}( ) ..\weather1.php:0
2 1.1302 405392 SimpleXMLElement->__construct( ) ..\weather1.php:40
( ! ) Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 40
Call Stack
# Time Memory Function Location
1 0.0008 384112 {main}( ) ..\weather1.php:0
2 1.1302 405392 SimpleXMLElement->__construct( ) ..\weather1.php:40
( ! ) Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 40
( ! ) Exception: String could not be parsed as XML in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 40
Call Stack
# Time Memory Function Location
1 0.0008 384112 {main}( ) ..\weather1.php:0
2 1.1302 405392 SimpleXMLElement->__construct( ) ..\weather1.php:40
$myxml=$result->GetWeatherResult;
$xml = new SimpleXMLElement($myxml);
$vals = array();
$vals[] = $xml;
foreach ($vals as $val)
{
if ($val['tag'] == 'CURRENTWEATHER')
{
$weather = $val['value'];
$weatherData[] = $weather;
}
}
print_r($weatherData);
Вылезли кучи ошибок:
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : Document labelled UTF-16 but has UTF-8 content in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 40
Call Stack
# Time Memory Function Location
1 0.0008 384112 {main}( ) ..\weather1.php:0
2 1.1302 405392 SimpleXMLElement->__construct( ) ..\weather1.php:40
( ! ) Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: <?xml version="1.0" encoding="utf-16"?> in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 40
Call Stack
# Time Memory Function Location
1 0.0008 384112 {main}( ) ..\weather1.php:0
2 1.1302 405392 SimpleXMLElement->__construct( ) ..\weather1.php:40
( ! ) Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 40
Call Stack
# Time Memory Function Location
1 0.0008 384112 {main}( ) ..\weather1.php:0
2 1.1302 405392 SimpleXMLElement->__construct( ) ..\weather1.php:40
( ! ) Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 40
( ! ) Exception: String could not be parsed as XML in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 40
Call Stack
# Time Memory Function Location
1 0.0008 384112 {main}( ) ..\weather1.php:0
2 1.1302 405392 SimpleXMLElement->__construct( ) ..\weather1.php:40
Спустя 44 секунды (22.06.2011 - 08:49) linker написал(а):
Widunder
Ну никто не запрещает самому выучить.
Ну никто не запрещает самому выучить.
Спустя 4 минуты, 16 секунд (22.06.2011 - 08:53) Widunder написал(а):
Не мешает, но ничего не работает вообще
Спустя 4 минуты, 9 секунд (22.06.2011 - 08:58) Widunder написал(а):
$dom = new DOMDocument;
$dom->loadXML("$myxml");
if (!$dom) {
echo 'Error while parsing the document';
exit;
}
$s = simplexml_import_dom($dom);
echo $s->tag[0]->CURRENTWEATHER;
Warning: DOMDocument::loadXML() [domdocument.loadxml]: Document labelled UTF-16 but has UTF-8 content in Entity, line: 1 in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 41
Call Stack
# Time Memory Function Location
1 0.0010 386672 {main}( ) ..\weather1.php:0
2 1.1936 408744 DOMDocument->loadXML( ) ..\weather1.php:41
( ! ) Warning: simplexml_import_dom() [function.simplexml-import-dom]: Invalid Nodetype to import in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 48
Call Stack
# Time Memory Function Location
1 0.0010 386672 {main}( ) ..\weather1.php:0
2 1.1942 408416 simplexml_import_dom ( ) ..\weather1.php:48
( ! ) Notice: Trying to get property of non-object in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 50
Call Stack
# Time Memory Function Location
1 0.0010 386672 {main}( ) ..\weather1.php:0
( ! ) Notice: Trying to get property of non-object in C:\wamp\www\Alina VinnichekAssign2\weather1.php on line 50
Call Stack
# Time Memory Function Location
1 0.0010 386672 {main}( ) ..\weather1.php:0
Спустя 26 секунд (22.06.2011 - 08:58) bulgakov написал(а):
попробуйте использовать simplexml_load_string():
$myxml=$result->GetWeatherResult;
$xml =simplexml_load_string($myxml);
$vals = array();
$vals[] = (array)$xml; // приведение объекта к массиву
var_dump($vals); // перед циклом посмотрите его структуру что бы правильно его использовать, там многомерный массив будет
foreach ($vals as $val)
{
if ($val['tag'] == 'CURRENTWEATHER')
{
$weather = $val['value'];
$weatherData[] = $weather;
}
}
print_r($weatherData);
Спустя 5 минут, 11 секунд (22.06.2011 - 09:03) Widunder написал(а):
Полным полно разных ошибок, и где-то посреди них затесались:
array
0 =>
array
0 => boolean false
array
0 =>
array
0 => boolean false
Спустя 1 час, 10 минут, 21 секунда (22.06.2011 - 10:14) bulgakov написал(а):
Проверьте что у вас возвращает строка $myxml=$result->GetWeatherResult; что в переменной $myxml.
Спустя 1 день, 18 часов, 18 минут, 18 секунд (24.06.2011 - 04:32) Widunder написал(а):
$params = array();
$params['CountryName']="$theCountry";
$params['CityName']="$theCity";
$result = $client->GetWeather($params);
// grab the xml from the result and put it into an array
$myxml=$result->GetWeatherResult;
$p=xml_parser_create();
xml_parse_into_struct($p,$myxml,$vals);
xml_parser_free($p);
?>
<html>
<body>
<h3>Current Weather at <?php echo $theCity . ' ......... ' . $theCountry ?> </h3>
<table border='2'>
<?php
print_r($myxml);
print "<br />";
print ("</tr></table>");
The selected location is: Christchurch ...... New Zealand
Current Weather at Christchurch ......... New Zealand
Christchurch, New Zealand (NZCH) 43-29S 172-33E 30M Jun 23, 2011 - 09:00 PM EDT / 2011.06.24 0100 UTC from the SSW (210 degrees) at 9 MPH (8 KT):0 greater than 7 mile(s):0 mostly clear 51 F (11 C) 42 F (6 C) 71% 29.71 in. Hg (1006 hPa) Success - это $myxml
а $vals как был пустым так и остался. Я вообще не в понятках в чём дело. Я уже какой день мучаюсь :((((((((((!
Спустя 3 дня, 23 часа, 42 минуты, 34 секунды (28.06.2011 - 04:14) Widunder написал(а):
В общем, оказалось, что такой функции как xml_parse_into_struct(); в php5 не существует, причём сервер не выдаёт никаких ошибок при её наличии.
Скажите пожалуйста где я могу скачать webdev2 - тобишь версией ниже? А то по Гуглу не могу найти.
Спасибо.
Скажите пожалуйста где я могу скачать webdev2 - тобишь версией ниже? А то по Гуглу не могу найти.
Спасибо.
Спустя 2 часа, 52 минуты, 18 секунд (28.06.2011 - 07:07) Семён написал(а):
У меня от одного названия темы уже взрыв мозга.