Elettracompany.com

Компьютерный справочник
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php domdocument loadxml

DOMDocument::loadXML

DOMDocument::loadXML — Загрузка XML из строки

Описание

Загружает XML-документ из строки.

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

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

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если вызвана статически, возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.

Ошибки

Если через аргумент source передана пустая строка, будет сгенерировано предупреждение. Это предупреждение генерируется не libxml, поэтому оно не может быть обработано функциями обработки ошибок libxml.

Этот метод может быть вызван статически, но при этом будет сгенерирована ошибка уровня E_STRICT .

Примеры

Пример #1 Создание документа

Пример #2 Статический вызов loadXML

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

  • DOMDocument::load() — Загрузка XML из файла
  • DOMDocument::save() — Сохраняет XML-дерево из внутреннего представления в файл
  • DOMDocument::saveXML() — Сохраняет XML-дерево из внутреннего представления в виде строки

User Contributed Notes 12 notes

Always remember that with the default parameters this function doesn’t handle well large files, i.e. if a text node is longer than 10Mb it can raise an exception stating:

DOMDocument::loadXML(): internal error Extra content at the end of the document in Entity

even though the XML is fine.

The cause is a definition in parserInternals.h of lixml:
#define XML_MAX_TEXT_LENGTH 10000000

To allow the function to process larger files, pass the LIBXML_PARSEHUGE as an option and it will work just fine:

loadXml reports an error instead of throwing an exception when the xml is not well formed. This is annoying if you are trying to to loadXml() in a try. catch statement. Apparently its a feature, not a bug, because this conforms to a spefication.

If you want to catch an exception instead of generating a report, you could do something like

0 ))
<
throw new DOMException ( $errstr );
>
else
return false ;
>

function XmlLoader ( $strXml )
<
set_error_handler ( ‘HandleXmlError’ );
$dom = new DOMDocument ();
$dom -> loadXml ( $strXml );
restore_error_handler ();
return $dom ;
>

Returning false in function HandleXmlError() causes a fallback to the default error handler.

earth at anonymous dot com,

preserveWhiteSpace property needs to be set to false for formatOutput to work properly, for some reason.

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadXML($xmlStr);
.
$element->appendChild(. );
.
$dom->formatOutput = true;
$xmlStr = $dom->saveXML();
echo $xmlStr;

This would format the output nicely.

For some reason, when you set DOMDocument’s property ‘recover’ to true, using ‘@’ to mask errors thrown by loadXml() won’t work.

Here’s my workaround:

function maskErrors() <>
set_error_handler(‘maskErrors’);
$dom->loadXml($xml);
restore_error_handler();

You could also simply do this: error_reporting(0); and then set back error_reporting to its original state.

Note that loadXML crops off beginning and trailing whitespace and linebreaks.

When using loadXML and appendChild to add a chunk of XML to an existing document, you may want to force a linebreak between the end of the XML chunk and the next line (usually a close tag) in the output file:

$childDocument = new DOMDocument;
$childDocument>preserveWhiteSpace = true;
$childDocument->loadXML(..XML-Chunk..);
$mNewNode = $mainDOcument->importNode($childDocument->documentElement, true);
$ParentNode->appendChild($mNewNode);
$ParentNode->appendChild($mainDocument->createTextNode(«\n «);

Although it is said that DOM should not be used to make ‘pretty’ XML output, it is something I struggled with to get something that was readable for testing. Another solution is to use the createDocumentFragment()->appendXML(..XML-Chunk..) instead, which seems not to trim off linebreaks like DOMDocument->loadXML() does.

When using loadXML() to parse a string that contains entity references (e.g., ), be sure that those entity references are properly declared through the use of a DOCTYPE declaration; otherwise, loadXML() will not be able to interpret the string.

$dd1 = new DOMDocument ();
$dd1 -> loadXML ( $str );

echo $dd1 -> saveXML ();
?>

Given the above code, PHP will issue a Warning about the entity ‘nbsp’ not being properly declared. Also, the call to saveXML() will return nothing but a trimmed-down version of the original processing instruction. everything else is gone, and all because of the undeclared entity.

Instead, explicitly declare the entity first:

]>

$dd2 = new DOMDocument ();
$dd2 -> loadXML ( $str );

echo $dd2 -> saveXML ();
?>

Since the ‘nbsp’ entity is defined in the DOCTYPE, PHP no longer issues that Warning; the string is now well-formed, and loadXML() understands it perfectly.

You can also use references to external DTDs in the same way (e.g., ), which is particularly important if you need to do this for many different documents with many different possible entities.

Also, as a sidenote. entity references created by createEntityReference() do not need this kind of explicit declaration.

DOMDocument::loadXML

DOMDocument::loadXML — Загрузка XML из строки

Описание

Загружает XML документ из строки.

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

Содержащая XML строка.

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

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если вызвана статически, возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.

Ошибки

Если через аргумент source передана пустая строка, будет сгенерировано предупреждение. Это предупреждение генерируется не libxml, поэтому оно не может быть обработано библиотечными обработчиками ошибок.

Читать еще:  Transfer function matlab

Этот метод может быть вызван статически, но при этом будет сгенерирована ошибка уровня E_STRICT .

Примеры

Пример #1 Создание документа

Пример #2 Статический вызов loadXML

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

  • DOMDocument::load() — Загрузка XML из файла
  • DOMDocument::save() — Сохраняет XML дерево из внутреннего представления в файл
  • DOMDocument::saveXML() — Сохраняет XML дерево из внутреннего представления в виде строки

Коментарии

Note that loadXML crops off beginning and trailing whitespace and linebreaks.

When using loadXML and appendChild to add a chunk of XML to an existing document, you may want to force a linebreak between the end of the XML chunk and the next line (usually a close tag) in the output file:

$childDocument = new DOMDocument;
$childDocument>preserveWhiteSpace = true;
$childDocument->loadXML(..XML-Chunk..);
$mNewNode = $mainDOcument->importNode($childDocument->documentElement, true);
$ParentNode->appendChild($mNewNode);
$ParentNode->appendChild($mainDocument->createTextNode(«\n «);

Although it is said that DOM should not be used to make ‘pretty’ XML output, it is something I struggled with to get something that was readable for testing. Another solution is to use the createDocumentFragment()->appendXML(..XML-Chunk..) instead, which seems not to trim off linebreaks like DOMDocument->loadXML() does.

While loadXML() expects its input to have a leading XML processing instruction to deduce the encoding used, there’s no such concept in (non-XML) HTML documents. Thus, the libxml library underlying the DOM functions peeks at the tags to figure out the encoding used.

loadXml reports an error instead of throwing an exception when the xml is not well formed. This is annoying if you are trying to to loadXml() in a try. catch statement. Apparently its a feature, not a bug, because this conforms to a spefication.

If you want to catch an exception instead of generating a report, you could do something like

0 ))
<
throw new DOMException ( $errstr );
>
else
return false ;
>

function XmlLoader ( $strXml )
<
set_error_handler ( ‘HandleXmlError’ );
$dom = new DOMDocument ();
$dom -> loadXml ( $strXml );
restore_error_handler ();
return $dom ;
>

Returning false in function HandleXmlError() causes a fallback to the default error handler.

earth at anonymous dot com,

preserveWhiteSpace property needs to be set to false for formatOutput to work properly, for some reason.

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadXML($xmlStr);
.
$element->appendChild(. );
.
$dom->formatOutput = true;
$xmlStr = $dom->saveXML();
echo $xmlStr;

This would format the output nicely.

When using loadXML() to parse a string that contains entity references (e.g., ), be sure that those entity references are properly declared through the use of a DOCTYPE declaration; otherwise, loadXML() will not be able to interpret the string.

$dd1 = new DOMDocument ();
$dd1 -> loadXML ( $str );

echo $dd1 -> saveXML ();
?>

Given the above code, PHP will issue a Warning about the entity ‘nbsp’ not being properly declared. Also, the call to saveXML() will return nothing but a trimmed-down version of the original processing instruction. everything else is gone, and all because of the undeclared entity.

Instead, explicitly declare the entity first:

]>

$dd2 = new DOMDocument ();
$dd2 -> loadXML ( $str );

echo $dd2 -> saveXML ();
?>

Since the ‘nbsp’ entity is defined in the DOCTYPE, PHP no longer issues that Warning; the string is now well-formed, and loadXML() understands it perfectly.

You can also use references to external DTDs in the same way (e.g., ), which is particularly important if you need to do this for many different documents with many different possible entities.

Also, as a sidenote. entity references created by createEntityReference() do not need this kind of explicit declaration.

The documentation states that loadXML can be called statically, but this is misleading. This feature seems to be a special case hack and its use seems to be discouraged according to http://bugs.php.net/bug.php?id=41398.

Calling the method statically will fail with an error if the code runs with E_STRICT error reporting enabled.

The documentation should be changed to make it clear that a static call is against recommended practice and won’t work with E_STRICT.

Possible values for the options parameter can be found here:

DOMDocument::loadXML

DOMDocument::loadXML — Загрузка XML из строки

Описание

Загружает XML документ из строки.

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

Содержащая XML строка.

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

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если вызвана статически, возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.

Ошибки

Если через аргумент source передана пустая строка, будет сгенерировано предупреждение. Это предупреждение генерируется не libxml, поэтому оно не может быть обработано библиотечными обработчиками ошибок.

Этот метод может быть вызван статически, но при этом будет сгенерирована ошибка уровня E_STRICT .

Примеры

Пример #1 Создание документа

Пример #2 Статический вызов loadXML

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

  • DOMDocument::load() — Загрузка XML из файла
  • DOMDocument::save() — Сохраняет XML дерево из внутреннего представления в файл
  • DOMDocument::saveXML() — Сохраняет XML дерево из внутреннего представления в виде строки

Коментарии

Note that loadXML crops off beginning and trailing whitespace and linebreaks.

Читать еще:  Цели защиты конфиденциальной информации

When using loadXML and appendChild to add a chunk of XML to an existing document, you may want to force a linebreak between the end of the XML chunk and the next line (usually a close tag) in the output file:

$childDocument = new DOMDocument;
$childDocument>preserveWhiteSpace = true;
$childDocument->loadXML(..XML-Chunk..);
$mNewNode = $mainDOcument->importNode($childDocument->documentElement, true);
$ParentNode->appendChild($mNewNode);
$ParentNode->appendChild($mainDocument->createTextNode(«\n «);

Although it is said that DOM should not be used to make ‘pretty’ XML output, it is something I struggled with to get something that was readable for testing. Another solution is to use the createDocumentFragment()->appendXML(..XML-Chunk..) instead, which seems not to trim off linebreaks like DOMDocument->loadXML() does.

While loadXML() expects its input to have a leading XML processing instruction to deduce the encoding used, there’s no such concept in (non-XML) HTML documents. Thus, the libxml library underlying the DOM functions peeks at the tags to figure out the encoding used.

loadXml reports an error instead of throwing an exception when the xml is not well formed. This is annoying if you are trying to to loadXml() in a try. catch statement. Apparently its a feature, not a bug, because this conforms to a spefication.

If you want to catch an exception instead of generating a report, you could do something like

0 ))
<
throw new DOMException ( $errstr );
>
else
return false ;
>

function XmlLoader ( $strXml )
<
set_error_handler ( ‘HandleXmlError’ );
$dom = new DOMDocument ();
$dom -> loadXml ( $strXml );
restore_error_handler ();
return $dom ;
>

Returning false in function HandleXmlError() causes a fallback to the default error handler.

earth at anonymous dot com,

preserveWhiteSpace property needs to be set to false for formatOutput to work properly, for some reason.

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadXML($xmlStr);
.
$element->appendChild(. );
.
$dom->formatOutput = true;
$xmlStr = $dom->saveXML();
echo $xmlStr;

This would format the output nicely.

When using loadXML() to parse a string that contains entity references (e.g., ), be sure that those entity references are properly declared through the use of a DOCTYPE declaration; otherwise, loadXML() will not be able to interpret the string.

$dd1 = new DOMDocument ();
$dd1 -> loadXML ( $str );

echo $dd1 -> saveXML ();
?>

Given the above code, PHP will issue a Warning about the entity ‘nbsp’ not being properly declared. Also, the call to saveXML() will return nothing but a trimmed-down version of the original processing instruction. everything else is gone, and all because of the undeclared entity.

Instead, explicitly declare the entity first:

]>

$dd2 = new DOMDocument ();
$dd2 -> loadXML ( $str );

echo $dd2 -> saveXML ();
?>

Since the ‘nbsp’ entity is defined in the DOCTYPE, PHP no longer issues that Warning; the string is now well-formed, and loadXML() understands it perfectly.

You can also use references to external DTDs in the same way (e.g., ), which is particularly important if you need to do this for many different documents with many different possible entities.

Also, as a sidenote. entity references created by createEntityReference() do not need this kind of explicit declaration.

The documentation states that loadXML can be called statically, but this is misleading. This feature seems to be a special case hack and its use seems to be discouraged according to http://bugs.php.net/bug.php?id=41398.

Calling the method statically will fail with an error if the code runs with E_STRICT error reporting enabled.

The documentation should be changed to make it clear that a static call is against recommended practice and won’t work with E_STRICT.

Possible values for the options parameter can be found here:

Using PHP DOMDocument: Code Examples Explained

The PHP DOM library allows you to manage HTML and XML after you upload your script into a new PHP DOMDocument. Parsing is an important concept referring to changing source code into a more easy-to-read format.

For reading and changing HTML and XML, DOM library is the best option as it is automatically built together with some PHP versions.

Contents

PHP DOMDocument: Main Tips

  • The XML data parser called DOM lets you manipulate XML scripts in your PHP code.
  • DOM is a tree-based parser (as opposed to event-based XML parsers).

XML Data: Example of Tree-Based Structure

To understand how DOM views XML data, let’s analyze the following code example:

XML data, as seen by DOM, has a tree-type structure:

  • XML document itself is level 1.
  • The root element, which is , is level 2.
  • The text element, which is Me , is level 3.

DOMDocument Properties

The following properties can help you find out information about your XML document:

Parsing Code Example

In our example below, we will be using a XML document called note.xml:

Theory is great, but we recommend digging deeper!

Become a PHP Specialist: Up to Date Video PHP Tutorial

How to Load and Output XML Data

This is the script you will need to use to initialize XML parser.

Читать еще:  Socket bind php

Here are the steps of this code example:

  1. We create a new XML DOM Document.
  2. We use the load function to load XML data into an object.
  3. We print the information from the XML DOMDocument we created.

Note: by using the function called saveXML(), we put internal XML data into a data string. It will then be ready to be displayed.

We get the following output:

Me You The Game You lost it.

If you try selecting View source in your browser, an HTML text will appear:

Executing Loops in XML Files

To initialize PHP XML parser, access the data and then iterate through, you should apply the foreach loop:

This code example follows the same steps: it creates a new XML DOM Document containing the data from note.xml file. Then, we apply foreach to print the nodeName and nodeValue .

This is the output we get in such a case:

Note: notice there is some white space left in our example. Keep in mind that XML DOMDocument may take those as elements and cause issues.

Learn to Make PHP Parse HTML

You should learn to create PHP DOMDocuments to modify HTML script. The following code example shows how you can create a PHP DOMDocument, containing HTML:

Сценарии объектной модели документа DOM XML средствами OLE-Automation

MS XML Parser как OLE-сервер

Библиотека MS XML Parser предоставляет возможность работы с XML-документами в скриптах, использующих объектную модель DOM XML. Такая работа возможна практически в любых средах, способных выступить в роли OLE-клиента. В данной статье примеры скриптов будут приводиться на языке VBScript для административных скриптов Windows. Вы можете копировать содержимое подобных примеров в текстовые файлы с расширением .vbs и запускать эти файлы на исполнение двойным щелчком мыши или из командной строки с помощью интерпретатора cscript.exe.

Объект DOMDocument создаётся следующим образом:

Set xmlParser = CreateObject(«Msxml2.DOMDocument»)

После этого вы можете вызывать и использовать методы и свойства этого объекта для чтения и записи XML-документов. Примечание: методы объектов XMLDOMDocument и XMLDOMElement во многом сходны, поэтому рассматриваются в данной статье совместно. Описание свойств, методов и событий в данной статье не является полностью исчерпывающим. Полное описание объектной модели MS XML Parser вы можете получить в MSDN, воспользовавшись, например, поиском по словосочетанию «IXMLDOMDocument/DOMDocument Members» или «IXMLDOMElement Members».

Пример XML-документа

В примерах кода, приведённых ниже, используется следующий «образцовый» XML-документ, представляющий из себя некий абстрактный упрощённый каталог товаров:

Вот XSL-таблица стилей для вышеприведённого документа, которая также является обычным XML-документом:

Загрузка XML-документа, отслеживание ошибок

Перечень свойств, методов и событий:

Свойства объекта XMLDOMParseError (все свойства доступны только для чтения):

Пример скрипта, осуществляющего загрузку XML-документа с проверкой на ошибки:

Пример асинхронной загрузки XML-документа:

Обход дерева элементов

Перечень свойств и методов:

Свойства и методы объекта-коллекции XMLDOMNodeList:

Коллекция XMLDOMNamedNodeMap помимо свойств и методов коллекции XMLDOMNodeList поддерживает методы:

Перебор наименований товаров из образцового XML-документа:

Ещё один способ перебора наименований товаров из образцового XML-документа (используем коллекцию XMLDOMNodeList):

Работаем с атрибутами. Выводим наименования только импортных товаров из образцового XML-документа:

Рекурсивный обход всего дерева элементов. Этот скрипт будет работать для любого XML-документа, в т.ч. для XSL-таблицы стилей, приведённой выше непосредственно после нашего «каталога товаров»:

Получение информации о текущем узле дерева XML-документа

Рекурсивный обход всего дерева элементов с выводом информации о текущем узле. Этот скрипт будет работать для любого XML-документа, в т.ч. для XSL-таблицы стилей, приведённой выше непосредственно после нашего «каталога товаров»:

Поиск и отбор узлов

В качестве параметра вышеуказанные методы принимают строку XSL-запроса (образец поиска — XSL pattern). Язык XSL-запросов напоминает способ определения пути в файловой системе — это список узлов, разделённых символом «/». Для указания на текущий элемент используется символ «.», на родительский — «..», для указания на все дочерние элементы — символ «*», для указания на элемент, расположенный ниже по дереву (не важно, на каком уровне вложенности) — символы «//». Условия в запросе заключаются в квадратные скобки «[» и «]». Имена атрибутов в запросе должны предваряться символом «@».

Вот примеры простейших запросов к образцовому XML-документу, расположенному в начале статьи:

  • «/PRODUCTS» — корневой элемент.
  • «//PRODUCT» или «/PRODUCTS/PRODUCT» — все элементы PRODUCT.
  • «//PRODUCT[@import]» — все элементы PRODUCT, в которых определён атрибут import.
  • «//PRODUCT[@import=’yes’]» — все элементы PRODUCT, у которых атрибут import равен «yes».
  • «//PRODUCT[SORT]» — все элементы PRODUCT, которые содержат хотя бы один элемент SORT.
  • «//SORT[COLOR or PRICE]» — все элементы SORT, которые содержат элементы COLOR или PRICE.

Выберем из образцового XML-документа и отобразим наименования отечественных товаров, у которых есть сорт серого цвета, а также всех импортных товаров:

Вот запрос, составленный по-другому, но возвращающий те же результаты:

Ещё один способ выборки, с использованием метода selectSingleNode:

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector