- Методы работы с «тяжёлыми» XML
- Simple XML
- xml_parser и XMLReader.
- Тест производительности
- Не работает simplexml_load_file и file_get_content в php?
- Работа с XML в PHP
- Парсинг сайтов
- Работа с XML в PHP
- Приемы работы
- Работа с атрибутами
- Теги с дефисами
- Перебор циклом
- Из объекта в нормальный массив
- Больше информации
- Парсинг на основе sitemap.xml
- Что вам делать дальше:
- Xml не работает php
- PHP: Как разобрать сложный XML-файл и не утонуть в собственном коде
Методы работы с «тяжёлыми» XML
На работе попросили провести исследование какими средствами лучше разбирать объёмный XML файл (более 100Mb). Предлагаю сообществу ознакомиться с результатами.
Рассмотрим основные методы работы с XML:
Simple XML
Минусы: работает очень медленно, собирает весь файл в память, дерево составляется в отдельных массив.
Плюсы: простота работы, работа «из коробки» (требует библиотеки libxml которая включена практически на всех серверах)
Минусы: работает очень медленно, как и все предыдущие примеры собирает весь файл в память.
Плюсы: На выходе привычный DOM с которым очень легко работать.
xml_parser и XMLReader.
Предыдущие 2 нам не подходят из-за работы с целым файлом, т.к. файлы у нас бывают по 20-30 Mb, и во время работы с ними некоторые блоки образуют цепочку (массив) в 100> Mb
Оба способа работают чтением файла построчно что подходит идеально для поставленной задачи.
Разница между xml_parser и XMLReader в том что, в первом случае вам нужно будет писать собственные функции которые будут реагировать на начало и конец тэга.
Проще говоря, xml_parser работает через 2 триггера – тэг открыт, тэг закрыт. Его не волнует что там идёт дальше, какие данные используются и т.д. Для работы вы задаёте 2 триггера указывающие на функции обработки.
В XMLReader всё проще. Во первых, это класс. Все триггеры уже заданы константами (их всего 17), чтение осуществляется функцией read() которая читает первое вхождение подходящее под заданные триггеры. Далее мы получаем объект в который заносится тип данных (аля триггер), название тэга, его значение. Также XMLReader отлично работает с аттрибутами тэгов.
Тест производительности
Результаты тестирования (чтение без разбора данных)
Источник
Не работает simplexml_load_file и file_get_content в php?
Добрый день уважаемые хабраспецы. Поставил в Gentoo php5.4 + apache2 + mysql. Начал ставить torrentmonitor. И тут я наткнулся на одну проблему, которую никак не могу решить. Насколько я могу судить не работают функции: file_get_content и simplexml_load_file. Т.е. вообще не загружают ничего. В тоже время тестовая страница с cURL нормально отрабатывает.
И да. PHP собран с USE флагом simplexml
Может вы сможете помочь мне с моей маленькой проблемой. Может я забыл еще какой-нибудь USE флаг. Заранее спасибо.
- Вопрос задан более трёх лет назад
- 6927 просмотров
ну, а вообще, вам там же и ответ:
В общем allow_url_fopen уже был включен, но ничего.
Вот ошибки, которые отображаются на экране
Сообщается что файл пустой, хотя это не так.
А вот функции, которые вызывают ошибки:
Причем вторая вообще молча отрабатывает и не вываливает никаких ошибок.
Источник
Работа с XML в PHP
Парсинг сайтов
Сейчас мы с вами изучим работу с XML. XML — это формат для обмена данными между сайтами. Он очень похож на HTML, только в XML разрешены свои теги и атрибуты.
Зачем нужен XML при парсинге? Иногда бывает так, что сайт, который вам нужно спарсить, имеет API, с помощью которого можно получить желаемое, особо не напрягаясь. Поэтому сразу совет — перед тем, как парсить сайт, проверьте, нету ли у него API.
Что такое API? Это набор функций, с помощью которых вы можете слать запрос этому сайту и получать нужный ответ. Вот этот ответ чаще всего приходит в формате XML. Поэтому давайте приступим к его изучению.
Работа с XML в PHP
Пусть у вас есть XML. Он может быть в строке, либо хранится в файле или отдаваться по запросу к определенному URL.
Пусть XML хранится в строке. В этом случае из этой строки нужно создать объект с помощью new SimpleXMLElement:
Сейчас у нас в переменной $xml хранится объект с разобранным XML. Обращаясь к свойствам этого объекта можно получать доступ с содержимому тегов XML. Как именно — разберем чуть ниже.
Если же XML хранится в файле или отдается по обращению к URL (что чаще всего и бывает), то следует использовать функцию simplexml_load_file, которая делает тот же объект $xml:
Приемы работы
В примерах ниже наш XML хранится в файле или по URL.
Пусть дан следующий XML:
Давайте получим имя, возраст и зарплату работника:
Как вы видите, у объекта $xml есть свойства, соответствующие тегам.
Вы может обратили внимание, что тег нигде не фигурирует при обращении. Это потому, что он корневой тег. Можно переименовать его, например, на — и ничего не поменяется:
Корневой тег в XML может быть только один, так же, как и тег в обычном HTML.
Давайте чуть модифицируем наш XML:
В этом случае у нас получится цепочка обращений:
Работа с атрибутами
Пусть некоторые данные хранятся в атрибутах:
Теги с дефисами
В XML разрешены теги (и атрибуты) с дефисом. В этом случае обращение к таким тегам происходит так:
Перебор циклом
Пусть теперь у нас не один работник, а несколько. В этом случае мы можем перебрать наш объект с помощью цикла foreach:
Из объекта в нормальный массив
Если вам неудобно работать с объектом, вы можете преобразовать его в нормальный массив PHP с помощью следующего хитрого приема:
Больше информации
Парсинг на основе sitemap.xml
Зачастую на сайте есть файл sitemap.xml. В этом файле хранятся ссылки на все страницы сайта для удобства индексации их поисковыми системами (индексация — это по сути и есть парсинг сайта яндексом и гуглом).
В общем-то нас мало должно волновать, зачем нужен этот файл, главное, что если он есть — можно не лазить по страницам сайта какими-либо хитрыми методами, а просто воспользоваться этим файлом.
Как проверить наличие этого файла: пусть мы парсим сайт site.ru, тогда обратитесь в браузере к site.ru/sitemap.xml — если что-то увидите, значит он там есть, а если не увидите — то увы.
Если sitemap есть — то в нем содежатся ссылки на все страницы сайта в формате XML. Спокойно забираете этот XML, парсите его, отделяете ссылки на нужные вам страницы любым удобным вам способом (например, анализом URL, который был описан в методе паука).
В итоге вы получаете список ссылок для парсинга, остается только зайти на них и спарсить нужным вам контент.
Подробнее об устройстве sitemap.xml читайте в википедии.
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Когда все решите — переходите к изучению новой темы.
Источник
Xml не работает php
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel
Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.
Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо
После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..
Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.
Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.
На последок как оно происходит на форумах
Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.
Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12
Источник
PHP: Как разобрать сложный XML-файл и не утонуть в собственном коде
Доброе время суток!
Сфера применения XML-формата достаточно обширна. Наряду с CSV, JSON и другими, XML — один из самых распространенных способов представить данные для обмена между различными сервисами, программами и сайтами. В качестве примера можно привести формат CommerceML для обмена товарами и заказами между 1С «Управление торговлей» и интернет-магазином.
Поэтому практически всем, кто занимается созданием веб-сервисов, время от времени приходится сталкиваться с необходимостью разбора XML-документов. В своем посте я предлагаю один из методов, как это сделать по возможности наглядно и прозрачно, используя XMLReader.
PHP предлагает несколько способов работы с форматом XML. Не вдаваясь в подробности, скажу, что принципиально их можно разделить на две группы:
- Загрузка всего XML-документа в память в виде объекта и работа с этим объектом
- Пошаговое чтение XML-строки на уровне тегов, атрибутов и текстового содержимого
Первый способ более понятен на интуитивном уровне, код выглядит прозрачней. Этот способ хорошо подходит для небольших файлов.
Второй способ — это более низкоуровневый подход, что дает нам ряд преимуществ, и вместе с тем несколько омрачает жизнь. Остановимся на нем поподробней. Плюсы:
- Скорость парсинга. Более подробно можете прочитать здесь.
- Потребление меньшего объема оперативной памяти. Мы не храним все данные в виде объекта, весьма затратного по памяти.
Но: мы жертвуем читаемостью кода. Если целью нашего парсинга является, скажем, подсчет суммы значений в определенных местах внутри XML с простой структурой, то проблем никаких.
Однако если структура файла сложна, еще работа с данными зависит от полного пути к этим данным, а результат должен включать в себя множество параметров, то здесь мы придем к довольно сумбурному коду.
Поэтому я написал класс, который впоследствии облегчил мне жизнь. Его использование упрощает написание правил и сильно улучшает читаемость программ, их размер становится в разы меньше, а код — красивее.
Основная идея в следующем: и схему нашего XML, и то, как с ней работать, мы будем хранить в одном-единственном массиве, повторяющем иерархию только необходимых нам тегов. Также для любого из тегов в этом же массиве мы сможем прописать нужные нам функции-обработчики открытия тега, его закрытия, чтения атрибутов или чтения текста, либо все вместе. Таким образом, мы храним структуру нашего XML и обработчики в одном месте. Одного взгляда на нашу структуру обработки будет достаточно для того, чтобы понять, что мы делаем с нашим XML-файлом. Оговорюсь, что на простых задачах (как в примерах ниже) преимущество в читаемости невелико, однако оно будет очевидно при работе с файлами относительно сложной структуры — например, форматом обмена с 1С.
Теперь конкретика. Вот наш класс:
Debug-версия (с параметром $debug):
Как видите, наш класс расширяет возможности стандартного класса XMLReader, к которому мы добавили один метод:
- $xml, $encoding, $options: как в XMLReader::xml()
- $structure: ассоциативный массив, полностью описывающий то, как мы должны работать с нашим файлом. Подразумевается, что его вид заранее известен, и мы точно знаем, с какими тегами и что мы должны делать.
- $debug: (только для Debug-версии) делать ли вывод отладочной информации (по умолчанию — откл.).
Аргумент $structure.
Это ассоциативный массив, структура которого повторяет иерархию тегов XML-файла плюс при необходимости в каждом из элементов структуры могут быть функции-обработчики (определены как поля с соответствующим ключом):
- «__open» — функция при открытии тега — function()
- «__attrs» — функция для обработки атрибутов тега (при наличии) — function($assocArray)
- «__text» — функция при наличии текстового значения тега — function($text)
- «__close» — функция при закрытии тега — function()
Если какой-либо из обработчиков возвратит false, то парсинг прервется, и функция xmlStruct() возвратит false. На приведенных ниже примерах видно, как конструировать аргумент $structure:
Пусть есть XML-файл:
Будут вызваны обработчики (в хронологическом порядке):
атрибуты root->a
текстовое поле root->a
открытие root->b
открытие root->b->x
текст root->b->x
закрытие root->b->x
закрытие root->b
Остальные поля обработаны не будут (в т.ч. root->d->x будет проигнорирован, т.к. он вне структуры)
Пусть есть XML-файл:
Это некий кассовый чек с товарами и услугами.
Каждая запись чека содержит идентификатор записи, тип (товар «product» или услуга «service»), наименование, количество и цена.
Задача: посчитать сумму чека, но раздельно по товарам и услугам.
Источник