Перейти к содержимому


Партнерская программа Kredov

Помогите с xml-парсером

#1 battrack

battrack
  • Пользователь
  • 7 сообщений
  • Репутация: 0
0

Отправлено 13 Январь 2009 - 22:25

Нашел статейку как написать простейший парсер xml-файлов. Там приведены примеры. Не буду их тут цитировать, а просто дам ссылку: http://www.providerz...-dom-intro.html
(там в довольно сжатой форме рассматривается написание парсера тремя способами: с помощью sax, dom, xpath).

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

<newsLine>
<news date="1.1.2002">
<title>title 1</title>
<text>
<part1>text part1 1</part1>
<part2>text part1 2</part2>
</text>
</news>
<news date="5.1.2002">
<title>title 2</title>
<text>
<part1>text part2 1</part1>
<part2>text part2 2</part2>
</text>
</news>
<news date="10.1.2002">
<title>title 3</title>
<text>
<part1>text part3 1</part1>
<part2>text part3 2</part2>
</text>
</news>
</newsLine>

так вот как будет выглядеть код sax парсера?

и еще, раз уж я тут задам еще вопрос: пробую вариант с парсерами на основе DOM или xPath, там есть такая строка: $xml = xmldoc($xml);

мне выдается ошибка, что не может выбрать неопределенную функцию xmldoc
Подскажите в чем дело


 

 

  • 0

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 14 Январь 2009 - 10:15

так вот как будет выглядеть код sax парсера?

Можно оставить также. Тогда обращение к элементу text будет давать 1, а part1 и part2 будут элементами того же массива.
Array
(
	[0] => Array
		(
			[date] => 1.1.2002
			[title] => title 1
			[text] => 

			[part1] => text part1 1
			[part2] => text part1 2
		)

	[1] => Array
		(
			[date] => 5.1.2002
			[title] => title 2
			[text] => 

			[part1] => text part2 1
			[part2] => text part2 2
		)

	[2] => Array
		(
			[date] => 10.1.2002
			[title] => title 3
			[text] => 

			[part1] => text part3 1
			[part2] => text part3 2
		)

)

Поэтому обращаться к ним в цикле, так же как и к другим...
<?php
foreach($news as $n)
{
	echo $n['title'];
	echo (isset($n['date'])) ? $n['date'] : "Дата не указана";
	echo $n['part1'];
	echo $n['part2'];
}
?>

Но это всё же неправильно... У нас написан простой SAX обработчик, и для обработки вложенности надо дописывать функцию
function saxStartElement($parser,$name,$attrs)
{
	global $currentNews,$index;

	switch($name)
	{
		case 'newsLine':
// Тег newsLine содержит все новости. Мы должны подготовить
// массив $news для приема новостей из XML файла.
			$news = array();
			break;
		case 'news':
// Каждая новость находится в теге news. Подготавливаем массив
// $currentNews для приема этой новости
			$currentNews = array();
// Если у новости есть дата - сохраняем ее в массиве
			if (in_array('date',array_keys($attrs)))
				$currentNews['date'] = $attrs['date'];
			break;
		default:
// Все остальные теги, которые могут встретиться в XML файле
// находятся внутри тега <news>, поэтому мы просто запоминаем
// их название с тем, чтобы знать, какие именно данные мы
// обрабатываем.
			$index = $name;
			break;
	};
}
надо дописывать в switch обработку тега text, тогда у вас уже будет массив в массиве ;)

и еще, раз уж я тут задам еще вопрос: пробую вариант с парсерами на основе DOM или xPath, там есть такая строка: $xml = xmldoc($xml);

мне выдается ошибка, что не может выбрать неопределенную функцию xmldoc


А вы для начала установили данный обработчик на ваш сервер?
DOMXML
  • 0


Оформление форума – IPBSkins.ru