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')) // атрибуты тега