разбор xml

e_moon

Новичок
разбор xml

Выручайте!

Помогите разобрать такой xlm для вывода
Код:
<?xml version="1.0" encoding="windows-1251" ?>
<lib>
 <books>
<book name="Техническая поддержка Photoshop 4" id="139" author="Кен Ойер" publish="Комиздат" year="1998">
<type name="Графика и дизайн"/>
</book>
<book name="Мир Corel Draw!" id="112" author="Михаэль Оссвальд" publish="BHV" year="1995">
<type name="Графика и дизайн"/>
</book>
<book name="Внутренний мир TCP / IP" id="285" author="Хейвуд Дрю" publish="DiaSoft" year="2003">
<type name="Коммуникации и сети"/>
<type name="Интернет-протоколы"/>
</book>
 </books>
</lib>
Я с xml никогда не работал, а то что освоил, думал можно "щелкать" при помощи регулярных выражений. А тут это не покатит...

Помогите со скриптом. Много денег нет, навряд кого устроит моя стипендия. Но я могу взаимно сделать для вас работу: баннер нарисовать, сверстать что-нибуть, скрипт написать (на своем уровне, но буду стараться).

Выручите, люди добрые!
 

e_moon

Новичок
А как? При помощи preg_match_all?
Как быть с type-тегом (он же массив?), чтобы привязать его к родителю?
 

Фанат

oncle terrible
Команда форума
вырезать все книги, а из них уже - все типы.
в общем, регами вырезать - без проблем.

но проще будет, действительно, получить сразу массив средствами xml
я могу взаимно сделать для вас работу: баннер нарисовать, сверстать что-нибуть, скрипт написать (на своем уровне, но буду стараться).
давай ты вот что сделаешь, для меня:
откроешь форум по XML, и попробуешь его почитать. а вдруг кто-то с подобными проблемами уже сталкивался?
 

e_moon

Новичок
Ну я тут скрипт один нашел с использованием xml_parser, переделал, вроде получаеться, но не совсем. получаеться - отдельно массив с книгами и отдельно массив с их категориями, который надо как вложенный массив положить.
Можно я скрипт выложу, поможете разобраться?
 

SiMM

Новичок
> Можно я скрипт выложу, поможете разобраться?
По правилам форума - не более 10-15 строк. Если больше - в collaborative irc debugging разве что.
 

Profic

just Profic (PHP5 BetaTeam)
Мама дорогая
PHP:
<?php
function convertUtf8ToCp1251($data) {
	return iconv('UTF-8', 'CP1251', $data);
}
ob_start('convertUtf8ToCp1251');

$lib = simplexml_load_file('test8.xml');

foreach($lib->books->book as $book) {
	echo $book['name'] . ': ';
	foreach($book->type as $type) {
		echo $type['name'] . ', ';
	}
	echo "\n";
}
?>
E:\>php test8.php
Техническая поддержка Photoshop 4: Графика и дизайн,
Мир Corel Draw!: Графика и дизайн,
Внутренний мир TCP / IP: Коммуникации и сети, Интернет-протоколы,

E:\>
 

Profic

just Profic (PHP5 BetaTeam)
.des.
Я знаю, но где-то говорилось про отсутствие последнего?

e_moon
Для твоего кода надо запоминать где-то какая книга сейчас парсится и добавлять тип в запомненную книгу.

Мама дорогая все равно не отменяется :)
PHP:
<?php
function addType($name) { 
	$GLOBALS['books'][count($GLOBALS['books']) - 1]['types'][] = $name;
}

function addBook($attrs) { 
	$GLOBALS['books'][] = $attrs + array('types' => array());
} 

function startElement($parser, $name, $attrs) {
	if ($name=="BOOK") addBook($attrs);
	if ($name=="TYPE") addType($attrs['NAME']); 
}

function endElement($parser, $name) {} 
function characterData($parser, $data) {}

function getArrayFromXml($file) {
	$xml_parser = xml_parser_create(); 
	xml_set_element_handler($xml_parser, "startElement", "endElement"); 
	xml_set_character_data_handler($xml_parser, "characterData"); 

	$data = file_get_contents($file); 
	if (!xml_parse($xml_parser, $data)) { 
		die(sprintf(
			"XML error: %s at line %d\n",
			xml_error_string(xml_get_error_code($xml_parser)),
			xml_get_current_line_number($xml_parser)
		)); 
	} 
	xml_parser_free($xml_parser); 
}

function convertUtf8ToCp1251($data) {
	return iconv('UTF-8', 'CP1251', $data);
}
ob_start('convertUtf8ToCp1251');

$books = array();
getArrayFromXml('test8.xml'); 
print_r($books); 

?>
 

e_moon

Новичок
Profic, скажите последний код только в PHP5?
У меня выводит только
Array ( [0] => Array ( [NAME] =>
(всмысле ничего). У меня стоит PHP4 и никаких ошибок не выдает...
 

Profic

just Profic (PHP5 BetaTeam)
e_moon
Нет, код должен работать и в php4.
Закомментируй строку "ob_start('convertUtf8ToCp1251');". В php5 все данные по умолчанию возвращаются в utf8 и я таким образом сделал быструю перекодировку из utf8 в cp1251.
 

e_moon

Новичок
Огромное спасибо (закоментировал строку - все работает)!!!
Profic, за мной должок!
 
Сверху