Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   SimpleXML вложеный элемент (https://javascript.ru/forum/server/10682-simplexml-vlozhenyjj-ehlement.html)

cuberboy 15.07.2010 14:04

SimpleXML вложеный элемент
 
<?xml version="1.0" encoding="utf-8" ?>
- <tv generator-info-name="tele.perm.ru">
- <channel id="1">
<display-name lang="ru">24 Док</display-name>
</channel>
- <channel id="2">
<display-name lang="ru">24 Техно</display-name>
</channel>
- <channel id="92">
<display-name lang="ru">2x2</display-name>
</channel>
</tv>

$xml=simplexml_load_file("http://192.168.9.5/amin/tvguide.xml");



foreach($xml->children()->channel as $x)
{
echo $x[id]." <br>";

};
а как добраться до вложенного? уже мозг порвал :blink:

cuberboy 15.07.2010 16:49

Решил проблему оказывается уроды предоставляющие данные не знают стандарта ((((

foreach($xml->channel as $x)
{
//echo $x[id];
echo( $x->display."<br>");

};

пред использованием убрать тире в display-name

x-yuri 16.07.2010 07:59

где в стандарте сказано, что нельзя в имени дефисы использовать?
http://www.w3.org/TR/2008/REC-xml-20081126/#NT-Name

cuberboy 16.07.2010 11:06

ну я сделал такой вывод после того как убрал дефис и всё стало работать. .....ну тогда SimpleXML тупит и не воспринимает дефисы

cuberboy 16.07.2010 23:14

ой какая жуть......файлик 5 мб, разбор формата в "лоб" через найти вырезать дало прирост производительности в два раза.

x-yuri 16.07.2010 23:21

ну он же наверное создает сначала дерево, т.е. парсит весь файл. Можешь другие парсеры попробовать

subzey 18.07.2010 14:45

Товарищи, да тут же SimpleXML даже не к чему.
<?php
$str = '<?xml version="1.0" encoding="utf-8" ?> 
	<tv generator-info-name="tele.perm.ru">
		<channel id="1">
			<display-name lang="ru">24 Док</display-name> 
		</channel>
		<channel id="2">
			<display-name lang="ru">24 Техно</display-name> 
		</channel>
		<channel id="92">
			<display-name lang="ru">2x2</display-name> 
		</channel>
	</tv>';

$document=new DOMDocument();
$document->loadXML($str);
$xpath = new DOMXpath($document);
foreach ($xpath->query("/tv/channel") as $channel_node){
	$channel_id = intval($channel_node->getAttribute('id'));
	$channel_name_node = $xpath->query("display-name", $channel_node)->item(0);
	$channel_name = $channel_name_node?$channel_name_node->textContent:"";
	/* что-нибудь полезное */
	echo "<br />{$channel_id}: {$channel_name}";
};


UPD: …а если нужно вывести только названия каналов, то решение вообще сокращается до неприлично короткого:
<?php
$str = '<?xml version="1.0" encoding="utf-8" ?> 
	<tv generator-info-name="tele.perm.ru">
		<channel id="1">
			<display-name lang="ru">24 Док</display-name> 
		</channel>
		<channel id="2">
			<display-name lang="ru">24 Техно</display-name> 
		</channel>
		<channel id="92">
			<display-name lang="ru">2x2</display-name> 
		</channel>
	</tv>';

$document=new DOMDocument();
$document->loadXML($str);
$xpath = new DOMXpath($document);
foreach ($xpath->query("/tv/channel/display-name") as $channel_name_node){
	$channel_name = $channel_name_node->textContent;
	
	echo "<br />{$channel_name}";
};

x-yuri 18.07.2010 18:51

Цитата:

Сообщение от subzey
Товарищи, да тут же SimpleXML даже не к чему.

subzey, а почему даже? И чем он от DOM так сильно отличается? Я понимаю, от xml parser, xml reader...

subzey 18.07.2010 21:01

x-yuri,
Для меня это просто из той же категории, что подключать jQuery, чтобы получить элемент по его id.

cuberboy 20.07.2010 10:58

не работал дум....от того и выбрал симпл. спасибо за инфу!!!


Часовой пояс GMT +3, время: 19:22.