[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите пожалуйста распарсить XML
smoke6969
Получаю от сервера ответ в виде XML в переменную $xml_response. Нужно вывести полученные данные в любом удобочитаемом виде, проще говоря, нужно получить массив, со значениями внутри тегов. Вот то, что я написал:



<?php
$XmlApi->sendRequest($xml_request, true );

$xml_response = $XmlApi->readResponse ();
if(!$xml_response) echo $XmlApi->getError();


} else {
echo $XmlApi->getError ();
die ();
}

}
else {
echo $XmlApi->getError ();
die ();
}
$vals = array();
$index = array();
$xml_parser = xml_parser_create();

if (!($fp = fopen($xml_response, "r"))) {
die("could not open XML input");
}
$data = fread($fp, filesize($file));
fclose($fp);
xml_parse_into_struct($xml_parser, $data, $vals, $index);
xml_parser_free($xml_parser);
?>


Я очень не силен в пхп, поэтому не судите строго. Как сделать, подскажите пожалуйста?



Спустя 2 дня, 22 часа, 49 минут, 45 секунд (9.11.2009 - 10:37) smoke6969 написал(а):
Что никто не знает как сделать? sad.gif

Спустя 2 дня, 7 часов, 31 минута, 42 секунды (11.11.2009 - 18:08) smoke6969 написал(а):
Попробовал разобраться в SimpleXML. Все равно не могу добиться чего хочу. Подскажите пожалуйста, где ошибся? Вот чтобы понять, хочу просто вывести значение $parsed_val, которое находится в первом теге <Supplier>, который в первом теге <Router>, который в первом <RouterList>, который в <StartRouting>, который в <CommandList>

	<?php	$XmlApi->sendRequest($xml_request, true );

$xml_response = $XmlApi->readResponse ();
if(!$xml_response) echo $XmlApi->getError();


} else {
echo $XmlApi->getError ();
die ();
}

}
else {
echo $XmlApi->getError ();
die ();
}

simplexml_load_string($xml_response);
$parsed_val->CommandList->StartRouting->RouterList[0]->Router[0]->Supplier[0];
echo $parsed_val;
?>


Выход:

Notice: Undefined variable: parsed_val in C:\apache\connect.ru\www\index.php on line 97

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 97

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 97

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 97

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 97

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 97

Notice: Undefined variable: parsed_val in C:\apache\connect.ru\www\index.php on line 98

Спустя 7 минут, 3 секунды (11.11.2009 - 18:15) glock18 написал(а):
Цитата
Notice: Undefined variable: parsed_val in C:\apache\connect.ru\www\index.php on line 97


$parsed_val не инициализирован

Спустя 27 минут, 20 секунд (11.11.2009 - 18:43) smoke6969 написал(а):
Простите за это пожалуйста. Такая инициализация прокатит?



<?php

$XmlApi->sendRequest($xml_request, true );

$xml_response = $XmlApi->readResponse ();
if(!$xml_response) echo $XmlApi->getError();


} else {
echo $XmlApi->getError ();
die ();
}

}
else {
echo $XmlApi->getError ();
die ();
}
$parsed_val = "";
simplexml_load_string($xml_response);
$parsed_val->CommandList->StartRouting->RouterList[0]->Router[0]->Supplier[0];
echo $parsed_val;

?>


Все равно не выводит и пишет:

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 97

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 97

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 97

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 97

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 97


Где еще может быть проблема?

Спустя 4 минуты, 26 секунд (11.11.2009 - 18:47) glock18 написал(а):
*Смайл с челюстью до пола* не покатит.

такая покатит
$parsed_val = simplexml_load_string($xml_response);


Спустя 7 минут, 5 секунд (11.11.2009 - 18:54) smoke6969 написал(а):
В очередной раз прошу прощения. Но все равно осталось (96 == $parsed_val->CommandList->StartRouting->) :


Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 96

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 96

Notice: Trying to get property of non-object in C:\apache\connect.ru\www\index.php on line 96



<?php
$XmlApi->sendRequest($xml_request, true );

$xml_response = $XmlApi->readResponse ();
if(!$xml_response) echo $XmlApi->getError();


} else {
echo $XmlApi->getError ();
die ();
}

}
else {
echo $XmlApi->getError ();
die ();
}
$parsed_val = simplexml_load_string($xml_response);
$parsed_val->CommandList->StartRouting->RouterList[0]->Router[0]->Supplier[0];
echo $parsed_val;
?>

Спустя 34 минуты, 58 секунд (11.11.2009 - 19:29) glock18 написал(а):
"продампь" что возвращает simplexml_load_string. и на основе этого обращайся к элементам. либо неверно обращаешься, либо xml неправильно парсится.

Спустя 18 часов, 13 минут, 45 секунд (12.11.2009 - 13:43) smoke6969 написал(а):
Пожалуйста, обьясните ну для дибилов почему не работает? sad.gif Вот создал сокращенную версию нужного xml и записал его в файл, сделал обработчик. Посмотрите пожалуйста, если нет ошибок, то может в настройках апача или пхп что-то? Я уже голову сломал sad.gif

Все лежит в одной папке:

response.xml


<?xml version="1.0" encoding="utf-8"?>
<CommandList>
<StartRouting
millis="59">
<LoginId>
DDDDDJDDF</LoginId>
<RoutingId>
GHKGKGH</RoutingId>
<RouterList>
<Router>
<Supplier>
alitalia</Supplier>
<Vendor>
<Name>
Alitalia</Name>
<Url>
http://www.alitalia.com/</Url>
</Vendor>
<Complete>
false</Complete>
<RequestedLocations>
<Origin>
<Type>
airport</Type>
<Code>
LHR</Code>
</Origin>
<Destination>
<Type>
airport</Type>
<Code>
MAD</Code>
</Destination>
</RequestedLocations>
</Router>
</RouterList>
</StartRouting>
</CommandList>



index.php


<?php

$parsed_val = simplexml_load_file('response.xml');
$parsed_val->CommandList->StartRouting->RouterList->Router->Supplier;
echo $parsed_val;

?>


Все равно получаю:


Notice: Trying to get property of non-object in C:\apache\parse1.ru\www\index.php on line 4

Notice: Trying to get property of non-object in C:\apache\parse1.ru\www\index.php on line 4

Notice: Trying to get property of non-object in C:\apache\parse1.ru\www\index.php on line 4

Спустя 9 минут, 38 секунд (12.11.2009 - 13:53) Oyeme написал(а):
$parsed_val = simplexml_load_file('response.xml');

echo $parsed_val->getName() . "<br />";

foreach($parsed_val->children() as $child)
{
echo $child->getName() . ": " . $child . "<br />";
}

Спустя 2 часа, 13 минут, 3 секунды (12.11.2009 - 16:06) smoke6969 написал(а):
Спасибо большое за скрипт, но он же выводит только имена XML элементов, т.е. имена тегов. А как же все-таки вывести текст, который находится между тегов? Кстати почему у меня выводит только

CommandList
StartRouting

Ведь должен показать все элементы по идее?
Но все-же главное: как присвоить переменной, например $parsed_val, значение, которое находится например между <Supplier> и </Supplier>???
Т.е чтоб $parsed_val == "alitalia";

Спустя 19 часов, 36 минут, 55 секунд (13.11.2009 - 11:43) smoke6969 написал(а):
Ну как же мне вытащить то текст внутри тегов? sad.gif

Спустя 3 дня, 2 часа, 2 минуты, 44 секунды (16.11.2009 - 13:45) smoke6969 написал(а):
Начинаю разбираться по-немногу. Написал такой скрипт:

response1.xml


<?xml version="1.0" encoding="utf-8"?>
<CommandList>
<StartRouting
millis="59">
<LoginId>
DDDDDJDDF</LoginId>
<RoutingId>
GHKGKGH</RoutingId>
<RouterList>
<Router>
<Supplier>
alitalia</Supplier>
<Vendor>
<Name>
Alitalia</Name>
<Url>
http://www.alitalia.com/</Url>
</Vendor>
<Complete>
false</Complete>
<RequestedLocations>
<Origin>
<Type>
airport</Type>
<Code>
LHR</Code>
</Origin>
<Destination>
<Type>
airport</Type>
<Code>
MAD</Code>
</Destination>
</RequestedLocations>
</Router>
</RouterList>
</StartRouting>
</CommandList>



index1.php


<?

$parsed_val = simplexml_load_file('response1.xml');

foreach($parsed_val->children() as $child)
{
foreach($child->children() as $child)
{
foreach($child->children() as $child)
{
foreach($child->children() as $child)
{
switch ($child->getName())
{
case ("Supplier") :
$supplier = $child;
}
foreach($child->children() as $child)
{
switch ($child->getName())
{
case ("Name") :
$name = $child;
case ("Url") :
$url = $child;
case ("Type") :
$type = $child;
}
foreach($child->children() as $child)
{
switch ($child->getName())
{
case ("Type") :
$type = $child;
case ("Code") :
$code = $child;
}
}
}
}
}
}
}

echo $supplier."<br />";
echo $name."<br />";
echo $url."<br />";
echo $type."<br />";
echo $code."<br />";
echo $type."<br />";
?>


Собственно он выводит как раз почти все, что надо:


alitalia
Alitalia
http://www.alitalia.com/
airport
MAD
airport


Как вы сами видите, скрипт довольно уродский и абсолютно не подойдет для разбора большого ХМЛ. Скажите пожалуйста, есть ли способ прямого доступа к переменным в СимплХМЛ? Если нет, и то, что я написал, по-вашему вполне приемлемо, то как тогда мне отделить одинаковые имена элементов друг от друга? Т.е. тут есть <Code>MAD</Code> и <Code>LHR</Code> Как мне отделить их друг от друга? Помогите пожалуйста.

Спустя 21 час, 12 минут, 2 секунды (17.11.2009 - 10:57) smoke6969 написал(а):
Прикольно самому с собой общаться в форуме sad.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.