- Работа с XML в PHP
- Парсинг сайтов
- Работа с XML в PHP
- Приемы работы
- Работа с атрибутами
- Теги с дефисами
- Перебор циклом
- Из объекта в нормальный массив
- Больше информации
- Парсинг на основе sitemap.xml
- Что вам делать дальше:
- Работа с XML в PHP
- Работа с XML в PHP — PHP запись в XML
- Работа с XML в PHP — Чтение и получение данных из XML
- Работа с XML в PHP — Добавление узлов дерева в существующий XML
- Работа с XML в PHP — Перезапись элементов существующего XML
- Работа с XML в PHP — Удаление элементов XML
- Закрыть текущий элемент (тэг) в xmlwriter
- Читайте также похожие статьи:
- PHP5 SimpleXML — Вывод
- PHP SimpleXML — Получить значения узлов
- Пример
- XML другой файл
- PHP SimpleXML — Получить значение узлов определенных элементов
- Пример
- PHP SimpleXML — Получить значения узлов — цикл
- Пример
- PHP SimpleXML — Получить значения атрибутов
- Пример
- PHP SimpleXML — Получить значения атрибутов — цикл
- Пример
- PHP SimpleXML Справочник
- Упражнения
- Тесты
- КАК СДЕЛАТЬ
- ПОДЕЛИТЬСЯ
- СЕРТИФИКАТЫ
- Сообщить об ошибке
- Ваше предложение:
- Спасибо, за вашу помощь!
- Топ Учебники
- Топ Справочники
- Топ Примеры
- Веб Сертификаты
- Вывести xml с тегами php
- User Contributed Notes 15 notes
Работа с 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
Здравствуйте, уважаемые читатели блога LifeExample, в этой статье «Работа с XML в PHP» я расскажу о том, как считывать, перезаписывать, удалять и производить php запись в xml файл. А так же о том, как в принципе быстро и удобно создать и поместить данные в xml разметку. Будучи студентом работая над своими проектами, я самостоятельно писал библиотеки для обработки XML документов. Я очень рад, что теперь мне не приходится пользоваться своими велосипедами т.к. есть готовые решения присутствующие в PHP по умолчанию.
Работа с XML в PHP — PHP запись в XML
Инструмент XMLWriter был создан специально для записи в XML формате. Один из важных его методов это startDocument(), который позволяет задать кодировку версии XML.
Попробуем создать простенький XML следующего вида:
Получить такой формат можно с помощью XMLWriter таки вот образом:
Как видите, Работа с XML в PHP, благодаря XMLWriter становится невероятно простой, и сильно облегчает задачи записи XML формата. Далее приведу маленький комплекс примеров о том, как осуществить, на php запись в xml. Например, задача поставлена — получить файл XML в следующем формате:
1 / id>
2013-04-19 10:56:03 / time>
$350 / total>
/ customer>
2 / id>
2013-04-23 13:43:41 / time>
$1456 / total>
/ customer>
/ purchase>
Чтобы получить такую структуру нужно выполнить ряд не хитрых методов класса XMLWriter.
Следующий пример покажет, как добавлять атрибуты к узлам XML дерева, согласитесь это довольно востребованная задача в проектах, где необходима работа с XML.
$1.00 / price>
3% / discount>
/ product>
$0.90 / price>
3% / discount>
/ product>
/ products>
С помощью XMLWriter, делается это так:
Работа с XML в PHP — Чтение и получение данных из XML
Ниже будет приведен пример чтения и получения данных из XML с использованием классов XMLReader и SimpleXMLElement. Читать будем уже имеющийся XML объект, который мы создали в примере №1 при PHP записи в XML.
XMLReader используется для получения заданного узла из XML.
// Чтение XML формата
$rxml = new XMLReader ( ) ; //Создание элемента для чтения
$rxml -> xml ( $nXML ) ; //Загрузка XML, $nXML — строка в формате XML
//Переместиться к первому элементу customer
while ( $rxml -> read ( ) && $rxml -> name !== ‘customer’ ) ;
//Получим значение поля total у второго узла дерева
while ( $rxml -> name === ‘customer’ ) <
//Чтение текущего дочернего через SimpleXMLElement
$node = new SimpleXMLElement ( $rxml -> readOuterXML ( ) ) ;
//Проверяем, номер элемента, если он равен 2 то это искомый элемент
if ( $node -> id == 2 ) <
$amountSpent = $node -> total ;
break ;
>
//Переместиться к следующему элементу customer
$rxml -> next ( ‘customer’ ) ;
>
Часто задача возникает в получении данных из XML по значению, какого либо атрибута. Давайте по примеру №2 из раздела PHP запись в XML, получим название, цену и скидку продукта по его атрибуту pid = 315.
$rxml = new XMLReader ( ) ;
$rxml -> xml ( $nXML2 ) ;
while ( $rxml -> read ( ) && $rxml -> name !== ‘product’ ) ; //Перемещаемся к первому продукту
$name = «» ;
$price = «» ;
$discount = «» ;
while ( $rxml -> name === ‘product’ ) <
if ( $rxml -> getAttribute ( «pid» ) == «315» ) //если pid = 315 то это искомый элемент
<
$node = new SimpleXMLElement ( $rxml -> readOuterXML ( ) ) ; //читаем значение элементов
$name = $node -> name ;
$price = $node -> price ;
$discount = $node -> discount ;
break ;
>
$rxml -> next ( ‘product’ ) ; //перемещаемся к следующему
>
echo «Продукт №315. Наименование: <$name>, цена: <$price>скидка: <$discount>» ;
Работа с XML в PHP — Добавление узлов дерева в существующий XML
Работая с XML в PHP, не редко приходится ломать голову над тем как добавить новый элемент в имеющуюся XML структуру. Используя XMLWriter и SimpleXMLElement сделать это очень легко:
Работа с XML в PHP — Перезапись элементов существующего XML
При активной работе с XML в PHP, приходится не только считывать и записывать элементы, но и редактировать имеющиеся. Перезапись существующего узла дерева XML может быть реализована следующим образом:
/**
* Перезапись узлов дерева XML формата.
*/
$productId = 314 ;
$parent = new DomDocument ;
// создаем новый элемент дома product
$parent_node = $parent -> createElement ( ‘product’ ) ;
//Добавляем атрибут
$attribute = $parent -> createAttribute ( «pid» ) ;
//устанавливаем значение
$attribute -> value = $productId ;
$parent_node -> appendChild ( $attribute ) ;
// Добавляем дочерний элементы
$parent_node -> appendChild ( $parent -> createElement ( ‘name’ , «Яблоко» ) ) ;
$parent_node -> appendChild ( $parent -> createElement ( ‘price’ , » $2 .00″ ) ) ;
$parent_node -> appendChild ( $parent -> createElement ( ‘discount’ , «1%» ) ) ;
//Вставляем созданные элементы в создаваемый ‘product’
$parent -> appendChild ( $parent_node ) ;
// Загружаем оригинальный XML формат
$dom = new DomDocument ;
$dom -> loadXML ( $nXML ) ;
// Находим имеющийся элемент с pid = 314
$xpath = new DOMXpath ( $dom ) ;
$nodelist = $xpath -> query ( «/products/product[@pid= <$productId>]» ) ;
$oldnode = $nodelist -> item ( 0 ) ;
// Импортируем созданый ранее элемент в текущее дерево
$newnode = $dom -> importNode ( $parent -> documentElement , true ) ;
// заменяем страрый элемент на новый
$oldnode -> parentNode -> replaceChild ( $newnode , $oldnode ) ;
// сохраняем XML
echo $dom -> saveXML ( ) ;
Работа с XML в PHP — Удаление элементов XML
Из всего выше рассмотренного, осталась только одна операция, без которой данную статью о работе с XML в PHP , нельзя считать завершенной – это удаление элементов. Удаление элементов самое легкое из всей связки операций. Ну что же, ломать – не стоить, давайте удалим один из продуктов.
//Удаление продукта Манго
//загрузим оригинальный формат XML
$productId = 315 ;
$dom = new DomDocument ;
$dom -> loadXML ( $nXML2 ) ;
// Найдем элемент который необходимо удалить
$xpath = new DOMXpath ( $dom ) ;
$nodelist = $xpath -> query ( «/products/product[@pid= <$productId>]» ) ;
$oldnode = $nodelist -> item ( 0 ) ;
// Удаляем элемент
$oldnode -> parentNode -> removeChild ( $oldnode ) ;
echo $dom -> saveXML ( ) ;
Закрыть текущий элемент (тэг) в xmlwriter
Найдя время и отвлекшись от основного своего проекта, я всё-таки опубликовал действительно полезную статью «Работа с XML в PHP«, и надеюсь она пригодится в своих разработках. Пишите мне на e-mail, с какими задачами вы сталкиваетесь, и я попробую сформировать материал по их решению в следующих статьях
Читайте также похожие статьи:
Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.
Источник
PHP5 SimpleXML — Вывод
SimpleXML — это расширение PHP, которое позволяет легко манипулировать и получать XML данных.
PHP SimpleXML — Получить значения узлов
Получить значения узлов из файла «note.xml»:
Пример
Вывод данных приведенного выше кода:
XML другой файл
Предположим, у нас есть XML файл «books.xml», он выглядит так:
PHP SimpleXML — Получить значение узлов определенных элементов
Следующий пример возвращает значение узла первого и второго элементов из и файла «books.xml»:
Пример
Вывод данных приведенного выше кода:
PHP SimpleXML — Получить значения узлов — цикл
Следующий пример перебирает все элементы в файле «books.xml», и получает значения узла элементов , , , и
Пример
Вывод данных приведенного выше кода:
PHP SimpleXML — Получить значения атрибутов
Следующий пример возвращает значение атрибута «category» из первого элемента и значение атрибута «lang» из атрибута во втором элементе :
Пример
Вывод данных приведенного выше кода:
PHP SimpleXML — Получить значения атрибутов — цикл
В следующем примере получены значения атрибутов элементов файла «books.xml»:
Пример
Вывод данных приведенного выше кода:
PHP SimpleXML Справочник
Для получения дополнительной информации о функциях PHP SimpleXML, посетите наш PHP SimpleXML Справочник.
Упражнения
Тесты
КАК СДЕЛАТЬ
ПОДЕЛИТЬСЯ
СЕРТИФИКАТЫ
Сообщить об ошибке
Если вы хотите сообщить об ошибке или сделать предложение, не стесняйтесь, присылайте нам электронное письмо:
Ваше предложение:
Спасибо, за вашу помощь!
Ваше сообщение было отправлено в SchoolsW3.
Топ Учебники
Топ Справочники
Топ Примеры
Веб Сертификаты
SchoolsW3 оптимизирован для обучения, тестирования и тренировки. Примеры упрощают и улучшают чтение и базовое понимание. Учебники, справочники, примеры постоянно пересматриваются, для того, чтобы избежать ошибки, невозможно гарантировать правильность всего содержимого. Используя данный сайт, вы соглашаетесь прочитать и принять условия использования, cookie и Политика конфиденциальности. Авторское право 1999 — 2021 Все права защищены.
Работает на W3.CSS.
Источник
Вывести xml с тегами php
Некоторые примеры этого руководства включают XML-строку. Вместо того, чтобы повторять её в каждом примере, положите эту строку в файл, который и включайте в каждом примере. Эта строка приведена в следующем примере. Помимо этого можно создать XML-документ и считывать его функцией simplexml_load_file() .
Пример #1 Файл example.php с XML строкой
Таким образом, это язык. Это всё равно язык программирования. Или
это скриптовый язык? Все раскрывается в этом документальном фильме,
похожем на фильм ужасов.
PHP решает все мои проблемы в вебе
7
5
XML;
?>
SimpleXML пользоваться очень просто! Попробуйте получить какую-нибудь строку или число из базового XML-документа.
Пример #2 Получение части документа
$movies = new SimpleXMLElement ( $xmlstr );
echo $movies -> movie [ 0 ]-> plot ;
?>
Результат выполнения данного примера:
В PHP получить доступ к элементу в XML документе, содержащим в названии недопустимые символы (например, дефис), можно путём заключения данного имени элемента в фигурные скобки и апострофы.
Пример #3 Получение строки
$movies = new SimpleXMLElement ( $xmlstr );
Результат выполнения данного примера:
Пример #4 Доступ к неуникальным элементам в SimpleXML
В том случае, если существует несколько экземпляров дочерних элементов в одном родительском элементе, то нужно применять стандартные методы итерации.
$movies = new SimpleXMLElement ( $xmlstr );
/* Для каждого узла , мы отдельно выведем имя . */
foreach ( $movies -> movie -> characters -> character as $character ) <
echo $character -> name , ‘ играет ‘ , $character -> actor , PHP_EOL ;
>
Результат выполнения данного примера:
Свойства ( $movies->movie в предыдущем примере) не являются массивами. Это итерируемый объект в виде массива.
Пример #5 Использование атрибутов
До сих пор мы только получали названия и значения элементов. SimpleXML может также получать доступ к атрибутам элемента. Получить доступ к атрибуту элемента можно так же, как к элементам массива ( array ).
$movies = new SimpleXMLElement ( $xmlstr );
/* Доступ к узлу первого фильма.
* Так же выведем шкалу оценок. */
foreach ( $movies -> movie [ 0 ]-> rating as $rating ) <
switch((string) $rating [ ‘type’ ]) < // Получение атрибутов элемента по индексу
case ‘thumbs’ :
echo $rating , ‘ thumbs up’ ;
break;
case ‘stars’ :
echo $rating , ‘ stars’ ;
break;
>
>
?>
Результат выполнения данного примера:
Пример #6 Сравнение элементов и атрибутов с текстом
Для сравнения элемента или атрибута со строкой или для передачи в функцию в качестве текста, необходимо привести его к строке, используя (string) . В противном случае, PHP будет рассматривать элемент как объект.
$movies = new SimpleXMLElement ( $xmlstr );
if ((string) $movies -> movie -> title == ‘PHP: Появление Парсера’ ) <
print ‘Мой любимый фильм.’ ;
>
echo htmlentities ((string) $movies -> movie -> title );
?>
Результат выполнения данного примера:
Пример #7 Сравнение двух элементов
Два элемента SimpleXMLElements считаются разными, даже если они указывают на один и тот же объект.
$movies1 = new SimpleXMLElement ( $xmlstr );
$movies2 = new SimpleXMLElement ( $xmlstr );
var_dump ( $movies1 == $movies2 ); // false
?>
Результат выполнения данного примера:
Пример #8 Использование XPath
SimpleXML включает в себя встроенную поддержку XPath . Поиск всех элементов :
$movies = new SimpleXMLElement ( $xmlstr );
foreach ( $movies -> xpath ( ‘//character’ ) as $character ) <
echo $character -> name , ‘ играет ‘ , $character -> actor , PHP_EOL ;
>
?>
‘ // ‘ служит в качестве шаблона. Для указания абсолютного пути, опустите одну из косых черт.
Результат выполнения данного примера:
Пример #9 Установка значений
Данные в SimpleXML не обязательно должны быть неизменяемыми. Объект позволяет манипулировать всеми элементами.
include ‘example.php’ ;
$movies = new SimpleXMLElement ( $xmlstr );
$movies -> movie [ 0 ]-> characters -> character [ 0 ]-> name = ‘Miss Coder’ ;
echo $movies -> asXML ();
?>
Результат выполнения данного примера:
Пример #10 Добавление элементов и атрибутов
SimpleXML имеет возможность легко добавлять дочерние элементы и атрибуты.
include ‘example.php’ ;
$movies = new SimpleXMLElement ( $xmlstr );
$character = $movies -> movie [ 0 ]-> characters -> addChild ( ‘character’ );
$character -> addChild ( ‘name’ , ‘Mr. Parser’ );
$character -> addChild ( ‘actor’ , ‘John Doe’ );
$rating = $movies -> movie [ 0 ]-> addChild ( ‘rating’ , ‘PG’ );
$rating -> addAttribute ( ‘type’ , ‘mpaa’ );
echo $movies -> asXML ();
?>
Результат выполнения данного примера:
Пример #11 Взаимодействие с DOM
PHP может преобразовывать XML-узлы из SimpleXML в формат DOM и наоборот. Этот пример показывает, как можно изменить DOM-элемент в SimpleXML.
= new DOMDocument ;
$dom -> loadXML ( ‘ чепуха ‘ );
if (! $dom ) <
echo ‘Ошибка при разборе документа’ ;
exit;
>
$books = simplexml_import_dom ( $dom );
echo $books -> book [ 0 ]-> title ;
?>
Результат выполнения данного примера:
User Contributed Notes 15 notes
There is a common «trick» often proposed to convert a SimpleXML object to an array, by running it through json_encode() and then json_decode(). I’d like to explain why this is a bad idea.
Most simply, because the whole point of SimpleXML is to be easier to use and more powerful than a plain array. For instance, you can write -> bar -> baz [ ‘bing’ ] ?> and it means the same thing as -> bar [ 0 ]-> baz [ 0 ][ ‘bing’ ] ?> , regardless of how many bar or baz elements there are in the XML; and if you write (string) $foo -> bar [ 0 ]-> baz [ 0 ] ?> you get all the string content of that node — including CDATA sections — regardless of whether it also has child elements or attributes. You also have access to namespace information, the ability to make simple edits to the XML, and even the ability to «import» into a DOM object, for much more powerful manipulation. All of this is lost by turning the object into an array rather than reading understanding the examples on this page.
Additionally, because it is not designed for this purpose, the conversion to JSON and back will actually lose information in some situations. For instance, any elements or attributes in a namespace will simply be discarded, and any text content will be discarded if an element also has children or attributes. Sometimes, this won’t matter, but if you get in the habit of converting everything to arrays, it’s going to sting you eventually.
Of course, you could write a smarter conversion, which didn’t have these limitations, but at that point, you are getting no value out of SimpleXML at all, and should just use the lower level XML Parser functions, or the XMLReader class, to create your structure. You still won’t have the extra convenience functionality of SimpleXML, but that’s your loss.
Источник