php domdocument xml пример

Основы DOM

(Document Object Model)

Наиболее широко применяемы XML-расширением на сегодняшний день является DOM и simpleXML, оба из них были добавлены в 5 версии PHP. Кроме данных XML-расширений также применяются XML (XML-парсер) и DOMXML, однако эти технологии считаются устаревшими.

Работа с DOM осуществляется в объектно-ориентированном стиле. Для начала работы с ним нужно создать объект domDocument. На практике это выглядит примерно так:

$dom_xml = new DomDocument;

При создании нового объекта domDocument вызывается конструктор DOMDocument=>__construct, имеющий два необязательных аргумента, которые указывают на версию документа и его кодировку

_ _construct ([string version [, string encoding]])

//Загрузка данных из файла с явным указанием экземпляра класса:

$dom_xml = new DomDocument;
$dom_xml->load(‘file.xml‘);

//Загрузка данных из файла без явного указания экземпляра класса:

$dom_xml=DomDocument:: load(‘file.xml’);

//Загрузка данных из строки с явным указанием экземпляра класса:

$dom_xml = new DomDocument;
$dom_xml->loadXML(‘ volvo ‘);

//Загрузка данных из строки без явного указания экземпляра класса:

$dom_xml = DomDocument::lоаdХМL(‘ volvo ‘);

Если загрузка данных прошла успешно, то будет возвращено TRUE, если нет, то FALSE

После того как данные загружены чаще всего осуществляется разбор их. Осуществить это можно при помощи метода DomDocument->getElementsByTagName(). Этот метод возвращает коллекцию объектов DOMNode.

$dom_xml= new DomDocument();
$dom_xml->loadXML(‘ volvo Lada ‘);
//записываем название модели в переменную

volvo model
Lada model

Основные свойства объекта DOMNode

nodeValueВозвращает значения узловchildNodesВозвращает дочерние узлы для текущего узлаfirstChildВозвращает верхний (первый) дочерний узелlastChildВозвращает последний дочерний узел

Основные методы объекта DOMNode

hasChildNodes()Осуществляет проверку на дочерние узлыappendChild()Добавляет элементreplaceChild()Замещает узелhasAttributes()Проверка атрибутов

Примеры работы с DOM можно увидеть на следующих страницах:

Источник

Методы работы с «тяжёлыми» XML

php domdocument xml пример. Смотреть фото php domdocument xml пример. Смотреть картинку php domdocument xml пример. Картинка про php domdocument xml пример. Фото php domdocument 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 отлично работает с аттрибутами тэгов.

Тест производительности

Результаты тестирования (чтение без разбора данных)

Источник

DOMDocument::saveXML

DOMDocument::saveXML — Сохраняет XML-дерево из внутреннего представления в виде строки

Описание

Создаёт XML-документ из представления DOM. Эту функцию обычно вызывают после построения нового DOM-документа, как показано в примере ниже.

Список параметров

Используйте этот аргумент для вывода только определённого узла без объявления XML, а не всего документа целиком.

Дополнительные настройки. На данный момент поддерживается только LIBXML_NOEMPTYTAG.

Возвращаемые значения

Возвращает XML или false в случае возникновения ошибки.

Ошибки

DOM_WRONG_DOCUMENT_ERR

Возникает, если node принадлежит другому документу.

Примеры

Пример #1 Сохранение DOM-дерева в виде строки

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 17 notes

How to display two tags when the node content is empty.

Example 2:

this is test

if you are storing multi-byte characters in XML, then saving the XML using saveXML() will create problems. It will spit out the characters converted in encoded format.

It took some searching to figure this one out. I didn’t see much in the way of explaining this glitch in the manual thus far. (For PHP5 I believe)

formatOutput = true; appears to fail when the origin of the DOM came from a file via load(). EX:

By adding the preserveWhiteSpace = false; BEFORE the load() the formatOutput works as expected. EX:

Quick tip to minimize memory when generating documents with DOM.

to dump a large DOM to the output buffer, use a PHP output stream, as in

A lot of memory will be saved when generating large DOMs.

When you save whole document:
DOMDocument->saveXML() produces string in encoding defined in property DOMDocument->encoding.

When you save only one node:
DOMDocument->saveXML(DOMNode) produces always string in UTF-8.

The simpliest (and probably the fastest) way to strip an XML declaration ( ) out of output document, is to output child nodes of DOMDocument separately:

?>

This might be userful when dealing with browser compatibility issues, for example, well known problem with valid XHTML in IE6.

If you want to save xhtml (in a string), you may try the following method:
= new DOMDocument ( ‘1.0’ );

Comment to `devin at SPAMISBAD dot tritarget dot com»s post:

Thanks for pointing out the pitfalls of `formatOutput’ vs. `load*()’. This has certainly saved me from some possible surprises.

I think the seemingly strange behaviour can be explained. Warning: The following stuff is mostly based on deductions and experiments. Much less on studying the sources and specs (I’m not sure some of these would provide answer anyway, at least not easily).

As you point out, `preserveWhiteSpace’ must be set before loading the DOM from the source string (I’m working with `loadXML()’ but I believe the situation should be the same with `load()’ you used). This looks logical, as this property seems to control the parsing and DOM creation process during which text nodes containing the whitespace are either included or dropped. This can be proven by dumping the DOM structure and comparing the results based on the value of `preserveWhiteSpace’. With `preserveWhiteSpace’ set to `FALSE’, no text nodes containing whitespace will be present in the returned DOM. When this property is `TRUE’, these nodes will be present.

Note: When speaking about the whitespace in the previous paragraph, we’re most certainly speaking about so called `whitespace in element content’ or `element content whitespace’, if I’m not mistaken. See also my comment in the notes of `DOMText->isWhitespaceInElementContent()’ method.

As for the mysterious effect on the output of `saveXLM()’, I think the explanation lies in the presence or absence of the above mentioned whitespace text nodes. This was also proven by experiments: After adding such a node into a DOM which contained none (the DOM was created using `loadXML()’ with `preserveWhiteSpace’ set to `FALSE’), the output formatting got affected in a such a way, the formatting got lost for the rest of the document after the added node. I think the presence of whitespace text nodes forces such rendering, that the content of these nodes is used to separate adjoining nodes thus disabling default formatting. Only when there are no such text nodes present, the ouput formatting takes effect (provided the `formatOutput’ is set to `TRUE’, of course).

Well, the thing I don’t really understand is how you did get an output of a signle line with `formatOutput’ set to `TRUE’. This has happened to me when no whitespace text nodes were present (ie. when loading the XML with `preserveWhiteSpace’ set to `FALSE’) *and* with `formatOutput’ set to *`FALSE’* (with the opposite value of `formatOutput’, the formatting should do it’s work and you should not end up with just one line). But I haven’t seen your source. Perhaps you had whitespace nodes containing no new-lines in your DOM?

As for the CAUTION about root element, I didn’t see any problems with empty root element neither in shortened nor full form. What did you have in mind, when you said it `WORKS’ or `DOES NOT WORK’?

As @fbernodi said earlier, there is a problem with saveXML of DOMNode when you have a number of defined namespaces. The simple solution for this:

We discovered using DOMDocument::saveHTML() that it converts to HTML 4.01 compatible markup; rather than XHTML. The simple answer is to use saveXML() instead, although this adds the XML declaration to the top.

Источник

Класс DOMDocument

Введение

Представляет все содержимое HTML- или XML-документа; служит корнем дерева документа.

Обзор классов

Свойства

Объявление типа документа, соответствующее этому документу.

Удобный атрибут, предоставляющий прямой доступ к дочернему узлу, как к элементу документа.

Кодировка документа, как указано в объявлении XML. Этот атрибут отсутствует в последней спецификации DOM Level 3, но является единственным способом манипулирования кодировкой XML-документа в этой реализации.

Проприетарное свойство. Включает режим восстановления, то есть пытается разобрать некорректно составленные (non-well formed) документы. Этот атрибут не является частью спецификации DOM и специфичен для libxml.

Установите в true для загрузки внешних элементов из объявления типа документа. Может быть полезным при включении элементов с символьными данными в XML-документ.

Патентованное свойство. Указывает, заменять или нет элементы документа. Этот атрибут не является частью спецификации DOM и специфичен для libxml.

Включение замещения объекта может облегчить атаки на внешний объект XML (XXE).

Атрибут, определяющий, как часть XML-объявления, кодировку эту документа. Имеет значение null в случаях, когда атрибут не задан, либо значение неизвестно, если, например, документ создан в памяти.

Атрибут, определяющий, как часть XML-объявления, номер версии этого документа. Если объявления в документе нет, но есть поддержка всех особенностей «XML», значение равно «1.0».

Примечания

Модуль DOM использует кодировку UTF-8. Используйте utf8_encode() и utf8_decode() для работы с текстами в кодировке ISO-8859-1 или iconv для других кодировок.

При использовании json_encode() для объекта DOMDocument будет получен результат кодирования пустого объекта.

Смотрите также

Содержание

User Contributed Notes 17 notes

Showing a quick example of how to use this class, just so that new users can get a quick start without having to figure it all out by themself. ( At the day of posting, this documentation just got added and is lacking examples. )

// Set the content type to be XML, so that the browser will recognise it as XML.
header ( «content-type: application/xml; charset=ISO-8859-15» );

For those landing here and checking for encoding issue with utf-8 characteres, it’s pretty easy to correct it, without adding any additional output tag to your html.

We’ll be utilizing: mb_convert_encoding

Thanks to the user who shared: SmartDOMDocument in previous comments, I got the idea of solving it. However I truly wish that he shared the method instead of giving a link.

Anyway coming back to the solution, you can simply use:

//turning off some errors
libxml_use_internal_errors ( true );

// do whatever you want to do with this code now

?>

I hope it solves the issue for someone! If you need my help or service to fix your code, you can reach me on nabtron.com or contact me at the email mentioned with this comment.

Here’s a small function I wrote to get all page links using the DOMDocument which will hopefully be of use to others

// Create a new DOM Document to hold our webpage structure
$xml = new DOMDocument ();

// Empty array to hold all links to return
$links = array();

For anyone else who has been having issues with formatOuput not working, here is a work-around:

rather than just doing something like:

You may need to save all or part of a DOMDocument as an XHTML-friendly string, something compliant with both XML and HTML 4. Here’s the DOMDocument class extended with a saveXHTML method:

/**
* XHTML Document
*
* Represents an entire XHTML DOM document; serves as the root of the document tree.
*/
class XHTMLDocument extends DOMDocument <

?>

This hasn’t been benchmarked, but is probably significantly slower than saveXML or saveHTML and should be used sparingly.

A nice and simple node 2 array I wrote, worth a try 😉

For using safely with script nodes when parsing, best option is extending DOMDocument, keeping script tags while DOMDocument process and rearrange them just after saveHTML function is called. Here is my custom class.

Easy function for basic output of XML file via DOM parsing

Look out for the following gotcha when loading XML from a string:

It’s set to the current working directory. If you want to manually set documentURI to something other than the CWD, do so AFTER the call to loadXML().

This function may help to debug current dom element:

Instance of DOMNodeList, node list:
Item #0, XPath: /library/book[1]

Fahrenheit 451
R. Bradbury

Item #4, XPath: /library/book[5]

The Moon Is a Harsh Mistress
R. A. Heinlein

It’s possible to use in object style to retrieve information, as:

# First you load a XML in a DomDocument variable.

# Then, you get the ArrayNodes from the DomDocument.

So here it is: SmartDOMDocument. You can find it at http://beerpla.net/projects/smartdomdocument/

Currently, the main highlights are:

Источник

DOMDocument

DOMDocument — класс для работы с XML-документами. Данный инструмент удобно использовать, когда вам необходимо парсить xml/html-документы.

Простой пример использования класса DOMDocument:

Рассмотрим основные ошибки и сложности с которыми можно столкнуться:

Кодировка

Для начала документ нужно загрузить с корректной кодировка. В случае, если мы работает не со всей страницей, а например с каким-то блоком, то элементов head и body нет и соответственно тега для указания кодировка тоже нет. DOMDocument доставит теги head и body самостоятельно, но кодировку нам нужно будет указать самостоятельно:

Так же документ необходимо правильно сохранить:

Иногда нам нужно на выходе получить конкретный елемент, а не весь документ, то мы так же можем это сделать:

Если нужно получить всю контентную часть тогда сохранение будет выглядеть примерно так:

Иногда приходится работать с невалидными документами. При загрузке DOMDocument исправит разметку. Можно убрать warnings с помощью следующей конструкции:

Выборки

Простые выборки можно сделать с помощью методов DOMDocument:

Любые выборки можно сделать с помощью объекта класса DOMXPath, который реализовывает спецификацию XPath:

СелекторДействие
/h1Выбрать все теги h1 в корне документа
body/h1Выбрать все теги h1 которые внутри body
body//h1Выбрать все теги h1 которые внутри body не зависимо от вложенности
//h1Выбрать все теги h1
//h1[@title]Выбрать все теги h1 с атрибутом title
//h1[@title=»Name title»]Выбрать все теги h1 с атрибутом title=»Name title»
//h1[span]Выбрать все теги h1 с тегом span внутри
//h1[span=»Some text»]Выбрать все теги h1 с тегом Some text внутри
//h1[span>40]Выбрать все теги h1 с тегом span у которого nodeValue > 40
*Выбрать все элементы
//@*Выбрать все атрибуты
//h1/*Выбрать все дочерние элементы тега h1
//title[@*]Выбрать все элементы с атрибутов title
//h1 | //h2Выбрать все элементы h1 и h2

XPath — не так прост, чем привычные всем CSS-селекторы, но XPath мощнее и может включать в себя функции, операторы сравнении, поиск элемента с дочерним элементом и другое.

Примеры функций XPath:

Проблема удаления

Если мы хотим удалить узел, то весь документ перестраивается. Следующий код отработает правильно только при первом удалении.

Решением является перебор елементов начиная с конца массива:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *