выборка из XML и запись данных в базу

entonee

Новичок
выборка из XML и запись данных в базу

Привет всем

попробую изложить как можно понятнее

есть xml файл - который каждый раз обновляется (так называемый livescore по футболу)

надо - записать все данные в базу (можно, в файл если так будет удобнее)

там просто очень много вложенных элементов я сильно путаюсь

структура файла - http://entonee.net/livescore/new.xml

=======

мне надо все записать в базу так чтоб я мог потом оттуда выводить - данные по странам и по матчам в этой стране или по всем матчам (вывод не проблема) главное все правильно в базу записать

=======

данные меняються по id т.е надо посмотреть - если id уже есть то его update сделать. если нет то создать новую запись

если ктото согласиться написать такой скрипт - за определенную плату то рассмотрю любые предложения...

данные посылаються POST-ом


Спасибо
 

akd

dive now, work later
Команда форума
ты определись, ты работу предлагаешь или хочешь сам это сделать?

-~{}~ 06.08.10 10:27:

если сам, то в чем проблема?
если работу, то огласи бюджет и дедлайн?
 

entonee

Новичок
дед лайн - как можно быстрее - днея 5 - неделя...

я никогда не платил за скрипты и не знаю сколько это стоит - если Ваша цена меня устроит то я соглашусь

+ я хочу понять как это реализовано будет



Спасибо
 

craz

Нестандартное звание
не фига не сложный xml
http://ru2.php.net/manual/en/class.domdocument.php
 

akd

dive now, work later
Команда форума
реализовано будет как обычно - парсинг - занесение в базу.
ничего сложного нет, работы от силы на 1 день.
садись и пиши.
 

entonee

Новичок
я только только изучаю XML - немного понял SimpleXML
мне ничего самому не надо писать в .xml документ

только брать оттуда инфу и записывать ее в базу данных

немного перефразирую

есть .xml

<stage name="gogo">
<match id="12'>
<name id="22" corde="55">Hello</name>
</match>
<match id="13'>
<name id="23" corde="56">go</name>
</match>
<match id="14'>
<name id="24" corde="57">welcome</name>
</match>
</stage>
<stage name="gogogo">
<match id="12'>
<name id="22" corde="55">Hello</name>
</match>
<match id="13'>
<name id="23" corde="56">go</name>
</match>
<match id="14'>
<name id="24" corde="57">welcome</name>
</match>
</stage>


надо чтоб у меня были переменные


$stagename[0] = gogo
$stagename[1] = gogogo


$matchid[0] = 12
$matchnameid[0] = 22
$matchnamecorde[0] = 56
$matchname[0] = Hello

$matchid[1] = 13
$matchnameid[1] = 23
$matchnamecorde[1] = 57
$matchname[1] = go

$matchid[2] = 14
$matchnameid[3] = 25
$matchnamecorde[4] = 57
$matchname[5] = welcome

-------

+ надо узнать кол-во эл-ов match - (в данном случае - 3), и кол-во эл-ов stage



Спасибо
 

entonee

Новичок
я читал уже все это

вот например

<?php
$string = <<<XML
<a>
<foo name="one" game="lonely">1</foo>
</a>
XML;

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
echo $a,'="',$b,"\"\n";
}
?>

это я понял - привязывем название атрибута к "a" а значение в "b"

но у меня не получаеться вывести все match
у меня выходить только 1-ый

----

как это зациклить? пытался сделать чтото вроде

foreach($xml->Sport->attributes() as $a => $b) {
$sportname[] = $b;
echo $sportname[1];
}
foreach($xml->Sport->Country as $item) {

foreach($item->attributes() as $a => $b) {
$countname[]= $b;
for ($i = 1; $i <= count($countname); $i++)
{
echo $countname[$i]." ";
}

}

}

Название Sport выводиться

а вот названия Country - (там у меня 6 штук) выводиться поочередно

название 1
айди 1

название 1
айди1
название 2
айди2

название1
айди1
название2
айди2
название3
айди3

и т.д.

-~{}~ 06.08.10 13:45:

http://keithdevens.com/software/phpxml/xml-to-php

вот эта штука делает то что мне надо
(правда надо с массивами еще разбираться)

вот класс

http://keithdevens.com/software/phpxml

я попробовал вот так

<?php
include('xmlll.php');


$xml = '<stage name="gogo">
<match id="12">
<name id="22" corde="55">Hello</name>
</match>
<match id="13">
<name id="23" corde="56">go</name>
</match>
<match id="14">
<name id="24" corde="57">welcome</name>
</match>
</stage>
<stage name="gogogo">
<match id="12">
<name id="22" corde="55">Hello</name>
</match>
<match id="13">
<name id="23" corde="56">go</name>
</match>
<match id="14">
<name id="24" corde="57">welcome</name>
</match>
</stage>';


$data = XML_unserialize($xml);
echo $data;

?>

но.. ничего не получилось... ничего не выводить вообще....
 

john.brown

просто кулибин
Ты с начала оределись со структурой бд, в которой будеш хранить результаты парсинга хмл - типа, таблицы sports, countries, seasons, matches... ну и прочие, которые нужны. А потом спокойно перебирай хмл - получил Sport, посмотрел name, проверил, есть у тебя такой уже в бд, или нет - если не - добавил, и дальше пошел. Поулучил страну - опять проверил, добавил, если надо, и дальше...

Т.е. не надо стремиться сразу готовую запись одной строчкой кода поиметь, а просто последовательно перебирать сущности, и формировать из них записи для бд.
 

entonee

Новичок
Привет - все вроде получилось..
все работает... вот результат ...

www.entonee.net/livescore/

www.entonee.net/livescore/new.xml(полный линк на .xml файл...)

только в последнем цикле - Warning: Invalid argument supplied for foreach() in /home2/entonee/public_html/livescore/index.php on line 127

127-ая строка написанна комментом...

объясните плиз изза чего это может быть...

Спасибо

PHP:
$xml = simplexml_load_file("new.xml");

foreach($xml->Sport->Country as $country){
	
	echo "<hr><b>".$country->attributes()->name."</b><br>";
	foreach($country->Tournament->Season->Stage->Match as $matchname){
				
				
				$matchid = $matchname->attributes()->id;
				$matchnm = $matchname->attributes()->name;
			
				echo "name=".$matchnm." | id=".$matchid." | status=".$matchname->Status->Description." | schet(Current)=".$matchname->Scores->Score->HomeTeam.":".$matchname->Scores->Score->AwayTeam."<br>";
				echo "<blockquote style=\"color:#f00\">";
			        echo "Events:<br /><br />"; // 127 а строка 
				foreach($matchname->Events->Event as $name){
					echo "chto->".$name->attributes()->type." kogda->".$name->attributes()->minute." kto->".$name->Player->Name." schet->".$name->attributes()->score."<br>";
				}
				echo "</blockquote>";
				}
	echo "<hr>";
			
			
								
				
}
 

FB3

Новичок
entonee
скорей всего 127 строка - это следующая за той, что ты обозначил.
Вероятно, попадаются пустые Events.
var_dump($matchname) поставь и посмотри, что выдаст
 

entonee

Новичок
Автор оригинала: FB3
entonee
скорей всего 127 строка - это следующая за той, что ты обозначил.
Вероятно, попадаются пустые Events.
var_dump($matchname) поставь и посмотри, что выдаст
Спасибо огромное ) так же хочу выразить свою благодарность всем кто тут отписался.. особенно john.brown

прошелся еще по Турнаментам - так как они в одной стране тоже могут повторятся...
и добавил маленький isset....
все получилось ) вот конечный код если кому надо будет



PHP:
$xml = simplexml_load_file("new.xml");

foreach($xml->Sport->Country as $country){
	
	echo "<hr><b>".$country->attributes()->name."</b><br>";
	
	foreach($country->Tournament as $tournament){
	echo "<blockquote style=\"color:#00f\"><br>Tournament = ";
	echo $tournament->attributes()->name."<br>";
			echo "</blockquote>";
				foreach($tournament->Season->Stage->Match as $matchname){
				
				
				$matchid = $matchname->attributes()->id;
				$matchnm = $matchname->attributes()->name;
			
				echo "name=".$matchnm." | id=".$matchid." | status=".$matchname->Status->Description." | schet(Current)=".$matchname->Scores->Score->HomeTeam.":".$matchname->Scores->Score->AwayTeam."<br>";
				echo "<blockquote style=\"color:#f00\">";
				echo "Events:<br /><br />";
				if(isset($matchname->Events->Event)){
			foreach($matchname->Events->Event as $name){
					echo "chto->".$name->attributes()->type." kogda->".$name->attributes()->minute." kto->".$name->Player->Name." schet->".$name->attributes()->score."<br>";
					}}else{
						echo "no Events in this match name...";
						}
				echo "</blockquote>";
				}
	echo "<hr>";
			
								
	}
}
 
Сверху