domdocument xml php примеры

Основы 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 можно увидеть на следующих страницах:

Источник

Document Object Model

User Contributed Notes 38 notes

It uses CSS selectors to fetch nodes.
Here’s example how it works:
// just one file to include
require( ‘phpQuery/phpQuery.php’ );

// query all unordered lists in last used DOM
pq ( ‘ul’ )-> insertAfter ( ‘div’ );

// same as pq(‘anything’)->htmlOuter()
// but on document root (returns doctype etc)
print phpQuery :: getDocument ();
?>

It uses DOM extension and XPath so it works only in PHP5.

This particular W3C page provides invaluable documentation for the DOM classes implemented in php5 (via libxml2). It fills in plenty of php.net’s gaps:

Some key examples:
* concise summary of the class heirachy (1.1.1)
* clarification that DOM level 2 doesn’t allow for population of internal DTDs
* explanation of DOMNode->normalize()
* explanation of the DOMImplementation class

The interfaces are described in OMG’s Interface Definition Language

The project I’m currently working on uses XPaths to dynamically navigate through chunks of an XML file. I couldn’t find any PHP code on the net that would build the XPath to a node for me, so I wrote my own function. Turns out it wasn’t as hard as I thought it might be (yay recursion), though it does entail using some PHP shenanigans.

Hopefully it’ll save someone else the trouble of reinventing this wheel.

After searching how to extend the DOMDocument and DOMElement I found a way in the bug: http://bugs.php.net/bug.php?id=35104. The following code shows how:

As of PHP 5.1, libxml options may be set using constants rather than the use of proprietary DomDocument properties.

Читайте также:  Как сделать чтобы присниться другому человеку во сне

DomDocument->resolveExternals is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDATTR

DomDocument->validateOnParse is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDVALID

PHP 5.1 users are encouraged to use the new constants.

If you are using not object-oriented functions and it takes too much time to change them all (or you’ll be replacing them later) then as a temporary decision can be used this modules:

I wrote a framework to implement the StyleSheet interfaces as specified on the W3C website. The code is written in PHP, and is NOT a complete implementation. Use it how ya like. I was planning on adding the CSSStyleSheet interfaces as well. Feel free to ask.

class MediaList extends StyleSheetList <

class DocumentStyle <
public styleSheets;

function __construct ( ) <
$this->styleSheets = new StyleSheetList();
>

class LinkStyle <
public sheet;

function __construct () <
$this->sheet = new StyleSheet();
>

class StyleSheet <
public type;
public disabled;
public ownerNode;
public parentStyleSheet;
public href;
public title;
public media;

If you want to print the DOM XML file content, you can use the next code:

I had problems with the dom2array_full function by «nospam at ya dot ru». Here’s my function, which works correctly for my project, and might work for yours:

$xml= new DOMDocument();
$xml->preserveWhiteSpace=false;
$xml->loadXML($xmlDoc);
print_r(xml2array($xml));

I’m moving servers, but I will probably throw this up on my blog when I get it back up.

*
*
UPDATE:
This function will now look for any subcontainer that has an href, it doesn’t have to be an H3
this will make it work with a few more formatted search results.
*/

Источник

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:

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

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

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

Источник

Класс 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:

Источник

Создание XML-документа на PHP

В нижеследующем примере идёт генерация XML-документа на PHP:

Всё самое основное, что Вы должны знать при создании XML-документов через PHP, находится в данном примере. Код я постарался хорошо прокомментировать, поэтому вопросов возникнуть не должно. Вы, обладая данными знаниями, уже можете создать практически любой XML-документ, используя стандарт DOM. А в следующей статье я Вам покажу, как парсить XML-документ через PHP.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Комментарии ( 1 ):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.

Источник

Читайте также:  мр картина пустого турецкого седла что это такое
Образовательный портал