XML - класс ТАО для работы с xml-документами

XML.Reader

При чтении больших XML-документов, например, с помощью DomDocument, файл сначала загружается в память целиком, и только потом начинается процесс парсинга. Скрипту может не хватить памяти в процессе работы. Для решения этой проблемы в PHP был разработан синтаксический анализатор XML - класс XMLReader. Данный класс реализует поточный парсинг, он выступает в роли курсора, который обходит поток документа и останавливается на каждом узле (весь документ не загружается сразу). Но использовать его в таком виде затратно, и практически невозможно использовать получившийся код повторно. Поэтому в ТАО был реализован модуль XML.Reader, который является «оберткой» над базовым расширением (наследуется от него) и предоставляет простой интерфейс для работы с XML.

У класса есть только один метод elements(), который принимает один параметр - имя тега элементов, которые необходимо будет найти. В ответ, метод возвращает экземпляр итератора по элементам. Сам поиск элементов будет производиться именно в тот момент, когда отрабатывается цикл.

Каждый найденный узел представляет собой экземпляр класса XML.Reader.Element, у которого есть следующие свойства и методы:

  • свойство attributes - массив атрибутов элемента;
  • метод as_string() - возвращает содержимое xml-узлов в виде строк.
  • метод as_simple_xml() - возвращает текущий элемент в виде SimpleXMLElement.
  • метод as_dom_node() - возвращает текущий элемент как экземпляр класса DomElement.

Например, необходимо выбрать все элементы тега с именем tag_name.

$xml = Core::make('XML.Reader');
$xml->open('/path/to/file.xml'); // подключим файл для поиска

$nodes = $xml->elements('tag_name'); // получим экземпляр итератора для выборки элементов по имени тэга '''tag_name''
foreach($nodes as $node) {
	$array = (array)$node->as_simple_xml(); //сконвертируем в массив
}

XML.Writer

Класс, наследуемый от XmlWriter PHP, реализующий методы генерирования потоков или файлов, содержащих данные XML.

Методы, реализованные в классе, являются оберткой методов класса XmlWriter.

  • open() - передает путь к файлу, в который будет производиться сохранение результата. Если путь передан (...->open('path/to/gale.xml')), то сохранение будет производиться в файл. Если не передан (...->open()), то сохраняться результат будет в память.
  • indent() - включить / отключить отступы, также можно задать строку оступа для каждого элемента.
  • output() - возвращает содержимое текущего буфера памяти.
  • start_document() / end_document() - создает объект DomDocument. В качестве аргументов можно передать номер текущей версии (или поменять его), кодировку для документа.
  • dtd - задает тег DOCTYPE.
  • start_cdata() / end_cdata() - записывает / закрывает тег CDATA.
  • start_comment() / end_comment() - записывает / закрывает тег комментария.
  • start_raw() / end_raw() - записывает / закрывает необработанный XML.
  • attribute() / attributes() - записать атрибут / массив атрибутов.
  • start_element() / end_element() - создать тег элемент. Аргументом в кавычках указывается имя тега.
  • text() - записать текст.
  • end() - закрыть открытый тег.
//Формирование xml-файла
$xml_writer = Core::make('XML.Writer'); //получим экземпляр класса
$xml_writer->open(); // путь к файлу, куда будет производиться сохранение результата. Здесь будем писать в память
// or $xml_writer->open('./uri_to_open');

	$xml_writer->document('1.0', 'UTF-8'); //создаем документ, версия 1.0, кодировка UTF-8
	$xml_writer->start_element('offers'); //создаем тег offers

	for ($i = 0; $i < 10; $i++) {
		$xml_writer
			->offer(array('campaign' => '1234123', 'type' => 'direct')) //создаем одноименный тег
			->title('Участки, Абабурово')
			->description('12 км от МКАД, от 13,5 млн. р. Только актуальные предложения. Звоните!')
			->url('http://www.my-site.ru/город/11402/?type[0]=110')
			->geo(1)
			->keyword('price', '0.5')
				->text('земля Абабурово') //такие теги желательно дополнительно закрывать (->end или $xml->end)
			->end
			->keyword('price', '0.5')
				->text('участок Абабурово')
			->end
			->cdata
				->text('asdfasdf')
			->end

		->end;
}
$xml_string = $xml_writer->output();

При создании тега у него может быть от одного до нескольких параметров. Если параметр один, и он не является массивом, то он будет являться содержимым тега. Если параметров два или массив параметров, то они будут выступать в роли атрибутов.

$xml->offer->title('земля') //содержимое тега
$xml->offer(array('campaign' => '1234123', 'type' => 'direct')) // атрибуты тега
Метки: xml
16.02.2015
Все статьи