Что такое код xml_parser_set_option

Содержание

Что такое код xml_parser_set_option

(PHP 3 >= 3.0.6, PHP 4, PHP 5)

xml_parser_set_option — Set options in an XML parser

Description bool xml_parser_set_option ( resource parser, int option, mixed value )

A reference to the XML parser to set an option in.

Which option to set. See below.

The option’s new value.

This function returns FALSE if parser does not refer to a valid parser, or if the option could not be set. Else the option is set and TRUE is returned.

The following options are available:

Таблица 1. XML parser options

Option constant Data type Description
XML_OPTION_CASE_FOLDING integer Controls whether case-folding is enabled for this XML parser. Enabled by default.
XML_OPTION_SKIP_TAGSTART integer Specify how many characters should be skipped in the beginning of a tag name.
XML_OPTION_SKIP_WHITE integer Whether to skip values consisting of whitespace characters.
XML_OPTION_TARGET_ENCODING string Sets which target encoding to use in this XML parser. By default, it is set to the same as the source encoding used by xml_parser_create() . Supported target encodings are ISO-8859-1 , US-ASCII and UTF-8 .

Пред. Начало След.
xml_parser_get_option Уровень выше xml_set_character_data_handler

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Что такое код xml_parser_set_option

(PHP 3>= 3.0.6, PHP 4)

xml_parser_set_option — устанавливает опции XML-разборщика.

Описание

bool xml_parser_set_option (resource parser, int option, mixed value)

Ссылка на XML-разборщик.

Какую опцию устанавливать. См. ниже.

Новое значение опции.

Эта функция возвращает FALSE , если parser не ссылается на правильный разборщик или если опция не может быть установлена. Иначе опция устанавливается и возвращается TRUE .

xml_parser_set_option

(PHP 4, PHP 5, PHP 7)

xml_parser_set_option — Set options in an XML parser

Description

Sets an option in an XML parser.

Parameters

A reference to the XML parser to set an option in.

Which option to set. See below.

The following options are available:

XML parser options

Option constant Data type Description
XML_OPTION_CASE_FOLDING integer Controls whether case-folding is enabled for this XML parser. Enabled by default.
XML_OPTION_SKIP_TAGSTART integer Specify how many characters should be skipped in the beginning of a tag name.
XML_OPTION_SKIP_WHITE integer Whether to skip values consisting of whitespace characters.
XML_OPTION_TARGET_ENCODING string Sets which target encoding to use in this XML parser.By default, it is set to the same as the source encoding used by xml_parser_create() . Supported target encodings are ISO-8859-1, US-ASCII and UTF-8.

The option’s new value.

Return Values

This function returns FALSE if parser does not refer to a valid parser, or if the option could not be set. Else the option is set and TRUE is returned.

User Contributed Notes

The option XML_OPTION_SKIP_WHITE has no effect in my PHP 5.2.6 (with expat-1.95.8-5). To skip cdata composed of white space only, simply check for that at the beginning of your cdata callback function:

function callback_cdata ( $parser , $cdata )
<
if(! trim ( $cdata ))
return;

A little mod to a function posted here.

function xml_to_array( $file )
<
$parser = xml_parser_create();
xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );
xml_parse_into_struct( $parser, file_get_contents($file), $tags );
xml_parser_free( $parser );

$elements = array();
$stack = array();
foreach ( $tags as $tag )
<
$index = count( $elements );
if ( $tag[‘type’] == «complete» || $tag[‘type’] == «open» )
<
$elements[$index] = array();
$elements[$index][‘name’] = $tag[‘tag’];
$elements[$index][‘attributes’] = $tag[‘attributes’];
$elements[$index][‘content’] = $tag[‘value’];

I’m a little confused about using xml_parser_set_option and xml_parser_get_option with XML_OPTION_SKIP_WHITE and XML_OPTION_SKIP_TAGSTART.

Looking at the source code, . set_option() accepts both . SKIP_WHITE and . SKIP_TAGSTART, and sets a program variables. On the other hand, . get_option() returns an error for both. I’m not sure of the code actually uses the variables properly, although it does reference the set variables. This does look like an oversite.

Had one heck of a time getting curl to send my XML request. Tried a lot of different things, FINALLY ended up with this.

Im making a curl request to paymentech / Orbital ‘s payment gateway. Essentially, I took the same header i made for the fsockopen() request, and used it for this curl request. (Hostinc company didnt allow fsockopen().

You’ll note that this specific gateway requires a custom content type header. Thats what gave me the most trouble. When using the CURLOPT_HTTPHEADER, and CURLOPT_POSTFIELDS together, it doesnt matter, it sends the default post header because of CURLOPT_POSTFIELDS.

$post_string = » All XML stuff Here » ;

$header = «POST » . $page . » HTTP/1.0 \r\n» ;
$header .= «MIME-Version: 1.0 \r\n» ;
$header .= «Content-type: application/PTI26 \r\n» ;
$header .= «Content-length: » . strlen ( $post_string ). » \r\n» ;
$header .= «Content-transfer-encoding: text \r\n» ;
$header .= «Request-number: 1 \r\n» ;
$header .= «Document-type: Request \r\n» ;
$header .= «Interface-Version: Test 1.4 \r\n» ;
$header .= «Connection: close \r\n\r\n» ;
$header .= $post_string ;

$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
curl_setopt ( $ch , CURLOPT_TIMEOUT , 4 );
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST , $header );

$data = curl_exec ( $ch ); if ( curl_errno ( $ch )) <
print curl_error ( $ch );
> else <
curl_close ( $ch );
>

// use XML Parser on $data, and your set!

$xml_parser = xml_parser_create ();
xml_parser_set_option ( $xml_parser , XML_OPTION_CASE_FOLDING , 0 );
xml_parser_set_option ( $xml_parser , XML_OPTION_SKIP_WHITE , 1 );
xml_parse_into_struct ( $xml_parser , $data , $vals , $index );
xml_parser_free ( $xml_parser );

// $vals = array of XML tags. Go get em!

?>

Worked like a dream for me. Enjoy!

PHP и XML

XML — это сокращение от extensible Markup Language (расширяемый язык разметки). Язык XML — подмножество гораздо более сложного языка SGML (Standard Generalized Markup Language — стандартный обобщенный язык разметки), но для использования XML не требуется что-либо знать о языке SGML. Язык XML определяет синтаксис создания структурированных документов, доступных для чтения людьми и компьютерами.

Язык XML позволяет создавать независимые от приложения форматы обмена данными. Такая возможность становится предпосылкой появления в будущем все более эффективных и простых методов разработки программ для веб.

Возможно, проще всего можно понять назначение языка XML, представив себе все те области обработки данных, в которых не может применяться язык HTML. Безусловно, HTML — это также язык разметки, но документы HTML никак нельзя назвать структурированными. Дескрипторы HTML (формально называемые тегами) и атрибуты представляют собой всего лишь простые идентификационные маркеры, распознаваемые браузером.

Например, пара согласованных дескрипторов

Из того факта, что в коде HTML отсутствует структура, следует, что машины поиска практически не могут воспользоваться указаниями, взятыми из самого кода и касающимися того, что является самым важным на каждой странице сайта или что означает каждый фрагмент текста в связи с другими фрагментами. Поэтому в машинах поиска используются различные методы выдвижения гипотез в отношении содержимого текста, но ни один из этих методов не гарантирует защиты от случайных ошибок.

Обычно те, кто впервые приступает к изучению языка XML, ознакомившись с этими предварительными сведениями, хотят сразу же рассмотреть пример кода XML. В действительности код XML во многом напоминает код HTML. В частности, пользователи языка HTML могут легко понять структуру простого файла XML, подобного приведенному ниже:

Вполне очевидно, что в коде XML имеются разнообразные дескрипторы и атрибуты, а также просматривается такая же иерархическая структура, как и в коде HTML. В языке XML каждая пара дескрипторов называется элементом.

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

  • В документе должен быть предусмотрен лишь единственный корневой элемент, который включает все другие элементы, подобно элементу в документах HTML. Иногда корневой элемент называют также элементом документа.
  • Структура вложения элементов должна быть иерархической. Это означает, что структура документа с дескрипторами является допустимой, а структура — нет. В первом примере очевидно, что элемент полностью включает элемент , а во втором примере элементы и перекрываются. Язык XML не допускает, чтобы дескрипторы включаемого элемента выходили за пределы дескрипторов включающего элемента (т.е. перекрывались).
  • Все элементы должны иметь закрывающий дескриптор (в этом состоит отличие XML от HTML, в котором допускается применение некоторых незакрытых элементов). Задача закрытия элемента может быть решена с использованием закрывающего дескриптора (например, ), как в языке HTML, или средства XML не требующим закрывающего дескриптора (например, ).
  • Элементы могут содержать другие элементы, текст и прочие данные. Если элемент включает фрагменты текста, напоминающие код XML (допустим, ), но не являются таковыми, или требуется исключить синтаксический анализ какого-то символа в тексте, то этот символ должен быть обозначен символами переключения на другой режим обработки.

Кроме перечисленных выше обязательных требований, которые относятся к категории так называемых требований по обеспечению формальной правильности, стандарт XML указывает также, что документы XML должны начинаться с идентификационного объявления XML. Это объявление представляет собой инструкцию по обработке, в которой указаны тип MIME и номер версии, как в примере . Это объявление не обязательное, но некоторые синтаксические анализаторы, не обнаружив его, выводят сообщение об ошибке. Кроме того, код XML чувствителен к регистру, а в некоторых версиях XML, таких как XHTML, требуется, чтобы имена дескрипторов и атрибутов состояли из строчных букв. В самом стандарте XML нет абсолютно никаких указаний в отношении дескрипторов с именами, состоящими из строчных букв, но всегда рекомендуется использовать дескрипторы и атрибуты, заданные в нижнем регистре, если нет весомых оснований для использования букв другого регистра.

Практическое применение языка XML

Выше были описаны основные преимущества языка XML, а в данном разделе рассматриваются основные области применения XML. Эта тема — довольно сложная. С точки зрения теории язык XML используется в трех направлениях: манипулирование данными и хранение данных; передача данных из одного программного приложения в другое; отображение страниц XML в браузере или в другом приложении с помощью директив вывода на дисплей, заданных в виде таблиц стилей.

На практике почти никто не использует язык XML для хранения данных в качестве основного средства представления данных, поскольку для представления данных повсеместно применяются реляционные структуры данных и язык SQL. Манипулирование данными с помощью XML обеспечить возможно, хотя все еще трудно (например, существует возможность редактировать документы, создавая и манипулируя узлами XML, а не внося изменения непосредственно в текст), но и в этом случае многие пользователи не находят особых преимуществ в подобном подходе. В последние несколько лет достигнуты значительные успехи в части методов представления кода XML в браузере, как правило, в форме XHTML, но реализация и этого подхода сопряжена с преодолением значительных сложностей.

Поэтому в настоящее время остается наиболее перспективным такое основное направление применения языка XML, как обмен данными между приложениями и организациями. Как оказалось, именно в этой области язык PHP может оказать самое непосредственное содействие. Например, с помощью программы C могут быть выполнены некоторые операции с данными, полученными из базы данных, затем осуществлен вывод результатов в коде XML, который может быть преобразован с помощью языка PHP в код HTML для отображения в браузере или другом приложении.

Такая организация потока данных, в которой применяется несколько промежуточных этапов, фактически имеет смысл, если незаметно для пользователя должен быть выполнен существенный объем вычислений. Дело в том, что, как правило, нецелесообразно создавать одну большую программу, которая выполняла бы сложные операции и выводила код HTML, если вместо этого можно воспользоваться несколькими программами.

Кроме того, язык PHP позволяет считывать данные из хранилища данных и непосредственно выводить сами документы XML. Необходимость в этом может возникнуть при передаче информационного наполнения с одного веб-сайта на другой, как, например, при распространении информационных материалов. К тому же указанные функциональные возможности часто позволяют помочь неквалифицированным пользователям подготавливать формально правильные документы XML с помощью интерфейса в виде веб-формы. Короче говоря, в настоящее время вывод кода XML, по-видимому, относится к наиболее распространенной категории задач PHP, связанных с XML.

Сравнение API-интерфейсов SAX и DOM

Для обработки кода XML и документов XML чаще всего применяются три основных типа API-интерфейсов: SimpleXML, объектная модель документа (Document Object Model — DOM) и простой API-интерфейс для XML (Simple API for XML — SAX). Все три этих модуля теперь включены во все дистрибутивы PHP.

Для синтаксического анализа и модификации любого документа XML можно использовать любой из трех API-интерфейсов — DOM, SAX или SimpleXML. А для создания или дополнения документа XML исключительно с помощью интерфейса PHP (иными словами, без написания каких-либо фрагментов документа XML вручную) необходимо использовать DOM. Каждый из API-интерфейсов имеет свои преимущества и недостатки, которые описаны ниже:

API-интерфейс SAX является менее трудоемким и более простым в изучении, но документ XML рассматривается в нем, по существу, как поток строковых данных. Таким образом, если, например, необходимо выполнить синтаксический анализ текста рецепта, то язык PHP позволяет быстро написать синтаксический анализатор SAX и с помощью него, допустим, обозначить полужирным шрифтом элементы списка ингредиентов. Но решить задачу добавления полностью нового элемента или атрибута будет очень сложно, и даже модификация значения одного конкретного ингредиента окажется трудоемкой.

API-интерфейс SAX очень хорошо подходит для выполнения единообразных задач, в которых требуется применение одной и той же операции ко всем элементам определенного типа, например, для замены конкретного дескриптора элемента дескрипторами HTML в ходе преобразования документа XML в документ HTML, предназначенный для вывода на экран. Синтаксический анализатор SAX обрабатывает документ один раз, от начала до конца, поэтому не позволяет возвращаться и выполнять действия с учетом входных данных, находящихся в документе вслед за обрабатываемым элементом.

Расширение DOM, предусмотренное в языке PHP, позволяет считывать файл XML и создавать в памяти дерево объектов, допускающее обход. Это дает возможность начать обработку с самого документа или с любого элемента документа (элементы в терминологии DOM именуются узлами), после чего получать или задавать значения дочерних и родительских узлов, а также текстовое информационное наполнение в каждой части дерева.

Объекты DOM можно сохранять в контейнерах, а также выводить их в виде текста. API-интерфейс DOM языка XML обеспечивает наилучшие результаты, если доступен весь документ XML. А если код XML поступает очень медленно в виде потока или требуется обработать много разных фрагментов XML как разделы одного и того же документа, то целесообразно использовать API-интерфейс SAX. Кроме того, в расширении DOM предусматривается формирование дерева в памяти, поэтому для обработки больших документов могут потребоваться значительные ресурсы.

SimpleXML

API-интерфейс SimpleXML позволяет быстро открыть файл XML, преобразовать некоторые из обнаруженных в нем элементов в собственные типы PHP (переменные, объекты и т.д.), а затем применить к этим собственным типам необходимые операции, как и в обычной программе. API-интерфейс SimpleXML позволяет обойтись без сложностей, связанных с выполнением большого количества дополнительных вызовов, которые требуются в API-интерфейсах SAX и DOM, и ограничиться меньшим объемом памяти. Кроме того, SimpIeXML часто предоставляет самый простой способ быстрого получения доступа к данным XML.

Тем не менее SimpIeXML имеет некоторые ограничения, в частности, этот API-интерфейс иногда ведет себя непредсказуемо при обработке атрибутов и глубоко вложенных элементов.

API-интерфейс DOM

API-интерфейс DOM объектной модели документа представляет собой всесторонне развитый API-интерфейс для создания, редактирования и синтаксического анализа документов XML. Сама технология DOM разработана в соответствии с рекомендациями консорциума W3C.

По существу, идея этого интерфейса состоит в том, что каждый документ XML можно рассматривать как иерархию узлов, напоминающую ветви дерева. С помощью указанного интерфейса можно создать представление структуры документа в любой программе, начиная с корневого элемента, по отношению к которому все другие элементы являются дочерними. За элементами могут быть также закреплены атрибуты и символьные данные. Исходная информация для создания дерева считывается в память из файла XML, после чего могут быть проведены манипуляции с помощью языка PHP, а содержимое дерева записано в другой файл XML или сохранено в контейнере.

В основе расширения DOM языка PHP лежит синтаксический анализатор gnome-libxml2 (аналогичный программе libxml2 системы Gnome), поскольку считается, что эта программа требует меньше объема памяти, чем другие.

Поскольку DOM XML — это единственный полностью объектно-ориентированный API-интерфейс в языке PHP, для его использования необходимо иметь определенное представление об объектно-ориентированном программировании. Так как количество объектов и методов в этом API-интерфейсе ограниченно, не нужно иметь особо глубокие знания объектно-ориентированного программирования, чтобы успешно применять DOM XML.

Применение DOM XML

Способы использования API-интерфейса DOM зависят от поставленных целей, но чаще всего требуется выполнить описанные ниже действия:

  1. Открыть новый документ DOM XML или прочитать его, поместив в оперативную память.
  2. Выполнить манипуляции с документом на уровне узлов.
  3. Вывести результирующий документ XML в виде строки или записать его в файл. Эта операция приводит также к освобождению памяти, используемой синтаксическим анализатором.

Ниже приведен простой пример, который демонстрирует использование некоторых простых функций DOM XML. Убедитесь в том, что права доступа к файлам пользователя, в учетной записи которого работает сервер, определены таким образом, что веб-сервер может записать файл в указанный каталог:

В результате выполнения этого кода генерируется XML-файл.

Функции DOM

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

Функции DOM XML верхнего уровня

Функция Назначение
domxml_open_mem() Принимает в качестве параметра строку, содержащую документ XML. Выполняет синтаксический анализ документа и создает объект Document
domxml_open_file() Принимает в качестве параметра строку, содержащую имя файла XML. Выполняет синтаксический анализ файла и создает объект Document
domxml_xmltree() Принимает в качестве параметра строку, содержащую документ XML. Создает дерево объектов PHP и возвращает объект DOM. Дерево объектов, возвращаемое этой функцией, допускает только чтение
domxml_new_doc() Создает новый, пустой документ XML в памяти. Возвращает объект Document

В таблице ниже приведены наиболее важные классы API-интерфейса DOM:

Классы DOM XML

Класс Назначение
DomDocument Инкапсулирует документ XML. Содержит корневой элемент и определение DTD, если таковое имеется
DomNode Инкапсулирует узел, или элемент. Узел может быть корневым или любым элементом в пределах корневого элемента. Узлы могут содержать другие узлы, символьные данные и атрибуты
DomAttr Инкапсулирует атрибут узла. Атрибут — это определяемая пользователем характеристика узла

В следующей таблице приведены наиболее важные методы класса DomDocument:

Методы классов DomDocument, DomNode и DomAttr

Метод Назначение
DomDocument -> createElement() Создает новый элемент, дескриптором которого является переданная строка. Этот элемент необходимо присоединить к другому элементу с помощью команды DomNode->appendChild()
DomDocument -> createTextNode() Создает новый текстовый узел (объект DomText). Этот узел необходимо присоединить к другому узлу с помощью команды DomNode->appendChild()
DomDocument -> save() Выводит документ XML из памяти в указанный файл
DomDocument -> saveXML() Выводит документ XML из памяти в строку. Необязательным параметром является объект DomNode
DomNode -> appendChild() Присоединяет узел к другому узлу
DomNode -> removeChild() Удаляет дочерний узел
DomAttr -> name() Возвращает имя атрибута
DomAttr -> value() Возвращает значение атрибута

API-интерфейс SAX

Так называемый простой API-интерфейс для XML широко применяется для синтаксического анализа документов XML. Данный API-интерфейс основан на использовании событий. Это означает, что синтаксический анализатор SAX вызывает указанные ему функции после обнаружения того, что активизировалось определенное событие в потоке событий.

История развития API-интерфейса SAX является очень интересной, особенно в сопоставлении с API-интерфейсом DOM. Прежде всего, API-интерфейс SAX не разрабатывался под эгидой какой-либо официальной организации по стандартизации, а был создан группой программистов, объединившихся вокруг списка рассылки XML-DEV, многие из которых уже реализовали свои собственные синтаксические анализаторы XML (в первую очередь на языке Java) без применения стандартного API-интерфейса.

API-интерфейс SAX действует no принципу использования множества обработчиков прерываний от событий. Эти обработчики прерываний задаются с помощью кода PHP. По мере того как синтаксический анализатор проходит по документу XML, распознаются такие фрагменты кода XML, как элементы, символьные данные и внешние сущности. Каждый случай распознавания активизируется как событие. Если синтаксическому анализатору предоставлена функция, подлежащая вызову после обнаружения какой-то конкретной разновидности событий, то синтаксический анализатор на время приостанавливает обработку такой функции после возникновения указанного события.

Полученные синтаксическим анализатором данные, которые связаны с определенным событием, предоставляются вызванной функцией. После завершения работы функции обработки события синтаксический анализатор SAX продолжает последовательную обработку документа, вызывая связанные с событиями функции до тех пор, пока не будет достигнут конец документа. Этот процесс остается однонаправленным на протяжении всей обработки, от начала до конца документа, поскольку синтаксический анализатор не может возвращаться назад или повторно обрабатывать какую-либо часть документа.

До выхода версии 5 в языке PHP использовался программный продукт expat Джеймса Кларка (James Clark) — широко применяемый инструментарий создания синтаксических анализаторов XML. Дополнительную информацию о программах expat можно найти на веб-сайте Кларка по адресу www.jclark.com/xml. Но если интерпретатор PHP откомпилирован вместе с библиотекой libxml2, то вы будете иметь возможность использовать весь свой код SAX для версии PHP4 и в версии PHP5 без каких-либо проблем.

К сожалению, термином синтаксический анализатор обозначают и программную библиотеку, такую как libxml2, и блок функций обработки XML в языке PHP. Но если речь идет о создании и вызове синтаксического анализатора, то подразумевается последняя, более конкретная трактовка. Последнее толкование подразумевается также в описаниях всех функций XML языка PHP, в которых используется термин синтаксический анализатор.

Применение API-интерфейса SAX

Способы использования API-интерфейса SAX зависят от поставленных целей, но чаще всего осуществляются описанные ниже действия:

  1. Определить, какого рода события подлежат обработке.
  2. Написать функции обработчиков для каждого из событий. При этом почти наверняка потребуется написать обработчик символьных данных, а также обработчики для начальных и конечных элементов.
  3. Создать синтаксический анализатор с использованием функции xml_parser_create(), а затем вызвать его с помощью функции xml_parse().
  4. Освободить память, занимаемую синтаксическим анализатором, с помощью функции xml_parser_free().

Ниже приведен простой пример применения всех основных функций XML (XML-файлом, используемым в данном примере, является файл test_dom.xml, который был создан выше):

Опции настройки конфигурации SAX

Среди опций настройки синтаксического анализатора XML, применяемого в сочетании с API-интерфейсом SAX, имеются две реконфигурируемые опции. Одна из них относится к приведению к единому регистру, а другая — к выбору целевой кодировки.

Опция приведения к единому регистру сохранилась как последствие ряда решений, принятых в прошлом, поэтому в наши дни, после того как язык XML окончательно объявлен чувствительным к регистру, может оказаться недействительной. Ранее версии языков SGML и HTML были нечувствительными к регистру, и поэтому для получения единообразных результатов, подлежащих сравнению, использовалась операция приведения к единому регистру (преобразования всех символов в верхний или нижний регистр во время синтаксического анализа).

Благодаря этому браузер приобретает способность, скажем, согласовывать дескриптор

с дескриптором . Но операция приведения к единому регистру оказалась неприемлемой из-за проблем, связанных с интернационализацией, поэтому после продолжительных дискуссий язык XML был объявлен как чувствительный к регистру. Если опция приведения к единому регистру разрешена, то все имена узлов, передаваемые обработчикам событий, преобразуются путем замены всех прописных букв строчными, поэтому, например, имя узла mynode поступает к обработчику событий в виде MYNODE. А если опция приведения к единому регистру запрещена, то открывающий дескриптор

не согласуется с закрывающим дескриптором

Использование опции приведения к единому регистру разрешено по умолчанию, что противоречит спецификации XML 1.0. Если применение этой опции не будет запрещено с помощью функции xml_parser_set_option(), то дескрипторы будут передаваться в обработчики событий после преобразования строчных букв в прописные.

Обработчики событий получают текстовые данные из синтаксического анализатора XML в одной из трех кодировок — ISO-8859-1, US-ASCII или UTF-8. По умолчанию применяется кодировка ISO-8859-1. Кодировка текста, передаваемого обработчикам событий, называется целевой кодировкой. По умолчанию целевая кодировка совпадает с кодировкой, используемой в исходном документе, которая называется исходной кодировкой. Если текст должен обрабатываться в кодировке, отличной от той, в которой он хранится, то можно изменить значение опции целевой кодировки.

Выборка значений опций кодировки и задание этих значений осуществляется с помощью функций xml_parser_get_option() и xml_parser_set_option(). Для управления операцией приведения к единому регистру используется константа XML_OPTION_CASE_FOLDING, а целевая кодировка задается с помощью константы XML_OPTlON_TARGET_ENCODING.

В следующем примере показано, как создать синтаксический анализатор XML, который считывает данные в коде ASCII, отменить опцию приведения к единому регистру и вывести результаты в кодировке UTF-8:

Функции API-интерфейса SAX

В таблице ниже приведен список наиболее важных функций SAX и описано их назначение:

Функции API-интерфейса SAX языка XML

Функция Назначение
xml_parser_create ([encoding]) Создает новый экземпляр синтаксического анализатора XML. В программе в любое время можно определить несколько разных синтаксических анализаторов. Возвращаемым значением является экземпляр синтаксического анализатора XML, в случае неудачного завершения функция возвращает значение false. Принимает один необязательный параметр — идентификатор кодировки символов (такой как UTF-8). Если кодировка не задана, по умолчанию применяется ISO-8859-1
xml_parse (parser, data, [final]) Вызывает на выполнение синтаксический анализатор XML. Ее параметрами являются синтаксический анализатор, созданный с использованием функции xml_parser_create(), строка, содержащая документ XML, и необязательный флажок завершения. Флажок завершения final позволяет указать, что текущий фрагмент данных представляет собой последний фрагмент, предназначенный для обработки этим синтаксическим анализатором
xml_get_error_code (parser) Если в процессе работы синтаксического анализатора возникает проблема, то выполняемый синтаксический анализ оканчивается неудачей. Вызов этой функции на выполнение позволяет определить код ошибки
xml_error_string (errorcode) После получения кода ошибки, возвращенного функцией xml_get_error_code(), возвращает строку, содержащую описание ошибки, которое может применяться для записи в лог
xml_set_element_handler (parser, start_element_handler, end_element_handler) Фактически устанавливает два обработчика, которые представляют собой просто функции. Первым из них является обработчик начального дескриптора элемента, имеющий доступ к имени элемента и к ассоциативному массиву атрибутов элемента, а вторым — обработчик конечного дескриптора элемента, который обеспечивает полный синтаксический анализ элемента
xml_set_character_data_handler (parser, cd_handler) Устанавливает функцию обработчика, которая вызывается каждый раз при обнаружении символьных данных. Функция обработчика принимает в качестве параметра строку, содержащую символьные данные
xml_parser_free (parser) Освобождает память, связанную с синтаксическим анализатором, который создан функцией xml_parser_create()
xml_set_default_handler (parser, handler) Устанавливает обработчик, применяемый по умолчанию. Если для некоторого события не указан ни один обработчик, то вызывается обработчик, применяемый по умолчанию, если он задан. Принимает в качестве параметра указатель на объект синтаксического анализатора и функцию-обработчик

API-интерфейс SimpleXML

API-интерфейс SimpleXML впервые появился в версии PHP 5 и рассматривается как средство отображения объектов. Указанный API-интерфейс не опирается на стандарты веб и направлен в основном на достижение простоты эксплуатации и сокращения потребности в памяти, пусть даже за счет определенной потери гибкости. Если требуется просто прочитать некоторые данные из документа XML и записать вместо них какие-то другие данные, то при решении этой задачи с помощью API-интерфейса SimpleXML потребуется наименьшее количество строк кода по сравнению со всеми другими возможными подходами.

В основе API-интерфейса SimpleXML лежит следующая идея: в программу передается сразу весь документ XML, после чего осуществляется синтаксический анализ документа и все результаты обработки документа сохраняются в памяти. Но документ хранится в памяти не в виде объекта DOM (с которым требуется выполнить дополнительные манипуляции, прежде чем использовать его содержимое), а в виде отдельных элементов, хранящихся в форме собственных переменных PHP, поэтому непосредственно доступных для применения. Безусловно, при решении многих задач, в которых используется API-интерфейс DOM, фактически не требуется проходить по всем дочерним и родительским узлам документа, а скорее необходимо применить одну и ту же операцию к группе вполне определенных узлов. Это означает, что SimpleXML в конечном итоге представляет собой характерный для языка PHP компромисс между подходами на основе SAX и DOM.

Использование API-интерфейса SimpleXML

При использовании API-интерфейса SimpleXML вначале с помощью функции simplexml_load_string() или simplexml_load_file() считывается представленный в какой-то форме (в виде строки или файла) код XML и присваивается переменной. Тем самым создается локальный объект, непосредственно доступный с помощью ссылки. В примере ниже показано, как можно применять API-интерфейс SimpleXML для получения значений переменных из файла XML с помощью всего лишь нескольких строк кода:

Функции API-интерфейса SimpleXML

В следующей таблице приведен список наиболее важных функций SimpleXML и указано их назначение:

Общие сведения о функциях SimpleXML

XML парсер

Все современные браузеры имеют встроенный XML парсер.

Этот XML парсер преобразует XML документ в объект XML DOM, которым затем можно манипулировать при помощи JavaScript.

Объект XMLHttpRequest

Объект XMLHttpRequest позволяет обмениваться данными в фоновом режиме.

Это настоящая сбывшаяся мечта разработчика, потому что вы можете:

  • Обновлять содержимое веб-страницы не перезагружая веб-страницу
  • Запрашивать данные с сервера, когда веб-страница уже загружена
  • Получать данные с сервера, когда веб-страница уже загружена
  • Посылать данные на сервер в фоновом режиме

Создание объекта XMLHttpRequest

Все современные браузеры (IE7+, Firefox, Chrome, Safari, Opera) уже имеют встроенный объект XMLHttpRequest.

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

Старые версии браузера Internet Explorer (IE5 и IE6) используют объект ActiveXObject:

Работа с объектом XMLHttpRequest

Типичный синтаксис JavaScript для работы с объектом XMLHttpRequest выглядит следующим образом:

В строке var xhttp = new XMLHttpRequest(); создается объект XMLHttpRequest.

В строке xhttp.onreadystatechange = function() свойство onreadystatechange определяет функцию, которая будет выполняться каждый раз, когда статус объекта XMLHttpRequest изменится.

Строка if (this.readyState == 4 && this.status == 200). Когда свойство readyState равно 4, и свойство status равно 200, ответ готов.

Свойство responseText возвращает ответ сервера в виде текстовой строки.

Эта текстовая строка может использоваться для изменения кода веб-страницы. Строка document.getElementBy >

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

Следующий фрагмент кода парсит XML документ в объект XML DOM:

Парсинг XML строки

Следующий фрагмент кода парсит XML строку в объект XML DOM:

Замечение: Браузер Internet Explorer использует метод loadXML() для парсинга XML строки, в то время, как остальные браузеры используют объект DOMParser.

Доступ к данным на других доменах

Из-за соображения безопасности современные браузеры не допускают возможности обращаться к данным на других доменах.

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

xml_parser_set_option

xml_parser_set_option — Установка значения настройки XML анализатора

Описание

Устанавливает значение настройки XML анализатора.

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

Ссылка на XML анализатор.

Какую настройку требуется установить. См. ниже.

Доступны следующие настройки:

Настройки XML анализатора
Константа Тип данных Описание
XML_OPTION_CASE_FOLDING integer Требуется ли включить case-folding для этого анализатора. Включено по умолчанию.
XML_OPTION_SKIP_TAGSTART integer Задает количество символов с начала имени тэга, которые следует пропустить.
XML_OPTION_SKIP_WHITE integer Требуется ли пропускать значения, состоящие из пробелов.
XML_OPTION_TARGET_ENCODING string Устанавливает кодировку, которая будет использоваться XML анализатором. По умолчанию используется кодировка заданная при вызове функции xml_parser_create() . Поддерживаются кодировки ISO-8859-1, US-ASCII и UTF-8.

Новое значение настройки.

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

Функция возвращает FALSE , если parser ссылается на недопустимый анализатор или если настройка не может быть установлена. В противном случае устанавливается новое значение настройки и возвращается значение TRUE .

Коментарии

The two ‘skip’ tags are not available to windows users using PHP 4.0.4. The following:

$skipWhite = xml_parser_get_option ($xmlParser,XML_OPTION_SKIP_WHITE);
$skipTagStart = xml_parser_get_option ($xmlParser,XML_OPTION_SKIP_TAGSTART);

generates the following errors:
Warning: xml_parser_get_option: unknown option in c:/program files/abria merlin/apache/htdocs/xml/sax_test.php on line 230

XML_OPTION_SKIP_WHITE works for me (linux, php 4.2.1)

XML Support active
XML Namespace Support active
EXPAT Version expat_1.95.2

i guess it depends on expat version/presence

Had one heck of a time getting curl to send my XML request. Tried a lot of different things, FINALLY ended up with this.

Im making a curl request to paymentech / Orbital ‘s payment gateway. Essentially, I took the same header i made for the fsockopen() request, and used it for this curl request. (Hostinc company didnt allow fsockopen().

You’ll note that this specific gateway requires a custom content type header. Thats what gave me the most trouble. When using the CURLOPT_HTTPHEADER, and CURLOPT_POSTFIELDS together, it doesnt matter, it sends the default post header because of CURLOPT_POSTFIELDS.

= «https://example.com» ;
$page = «/proccessing_page.cgi» ;

$post_string = » All XML stuff Here » ;

$header = «POST » . $page . » HTTP/1.0 \r\n» ;
$header .= «MIME-Version: 1.0 \r\n» ;
$header .= «Content-type: application/PTI26 \r\n» ;
$header .= «Content-length: » . strlen ( $post_string ). » \r\n» ;
$header .= «Content-transfer-encoding: text \r\n» ;
$header .= «Request-number: 1 \r\n» ;
$header .= «Document-type: Request \r\n» ;
$header .= «Interface-Version: Test 1.4 \r\n» ;
$header .= «Connection: close \r\n\r\n» ;
$header .= $post_string ;

$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
curl_setopt ( $ch , CURLOPT_TIMEOUT , 4 );
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST , $header );

$data = curl_exec ( $ch ); if ( curl_errno ( $ch )) <
print curl_error ( $ch );
> else <
curl_close ( $ch );
>

// use XML Parser on $data, and your set!

$xml_parser = xml_parser_create ();
xml_parser_set_option ( $xml_parser , XML_OPTION_CASE_FOLDING , 0 );
xml_parser_set_option ( $xml_parser , XML_OPTION_SKIP_WHITE , 1 );
xml_parse_into_struct ( $xml_parser , $data , $vals , $index );
xml_parser_free ( $xml_parser );

// $vals = array of XML tags. Go get em!

?>

Worked like a dream for me. Enjoy!

A little mod to a function posted here.

function xml_to_array( $file )
<
$parser = xml_parser_create();
xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );
xml_parse_into_struct( $parser, file_get_contents($file), $tags );
xml_parser_free( $parser );

$elements = array();
$stack = array();
foreach ( $tags as $tag )
<
$index = count( $elements );
if ( $tag[‘type’] == «complete» || $tag[‘type’] == «open» )
<
$elements[$index] = array();
$elements[$index][‘name’] = $tag[‘tag’];
$elements[$index][‘attributes’] = $tag[‘attributes’];
$elements[$index][‘content’] = $tag[‘value’];

In the function below, you need to update two lines if you don’t want php to throw warnings.

change these two:
$elements[$index][‘attributes’] = $tag[‘attributes’];
$elements[$index][‘content’] = $tag[‘value’];

to this:
$elements[$index][‘attributes’] = empty($tag[‘attributes’]) ? «» : $tag[‘attributes’];
$elements[$index][‘content’] = empty($tag[‘value’]) ? «» : $tag[‘value’];

The option XML_OPTION_SKIP_WHITE has no effect in my PHP 5.2.6 (with expat-1.95.8-5). To skip cdata composed of white space only, simply check for that at the beginning of your cdata callback function:

function callback_cdata ( $parser , $cdata )
<
if(! trim ( $cdata ))
return;

PHP XML Parser xml_set_default_handler разделяет специальный символ

Парсер XML PHP вызывает функцию обработчика по умолчанию дважды, когда он встречает специальный символ в строке и поэтому разбивает строку. Я попытался решить его, используя разные кодировки в заголовке XML, а также в PHP-коде, но он по-прежнему разделяет строку:

Можно было бы ожидать:

Я бы хотел, чтобы линия не разделялась, поэтому любая идея, что такое решение?

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

Вы можете справиться с этим, создав собственный класс парсера. Это вообще полезно, в любом случае, не только в этом случае. Но для этого случая это особенно важно, чтобы вы могли собрать текст метки, который распределяется по нескольким событиям.

Основная работа заключается в том, что функция обратного вызова выполняет публичную функцию класса и регистрирует эти функции.

Тогда каждый раз, когда label открывает тег, временный магазин сбрасывается. Когда текст появляется, он добавляется во временный магазин. Если label тега затем закрывается, вы можете передать этот текст на новый «событие» на этот раз функцию, которую вы ищете с этим текстом:

Что такое код xml_parser_set_option

(PHP 3>= 3.0.6, PHP 4)

xml_parser_set_option — устанавливает опции XML-разборщика.

Описание

bool xml_parser_set_option (resource parser, int option, mixed value)

Ссылка на XML-разборщик.

Какую опцию устанавливать. См. ниже.

Новое значение опции.

Эта функция возвращает FALSE , если parser не ссылается на правильный разборщик или если опция не может быть установлена. Иначе опция устанавливается и возвращается TRUE .

Таблица 1. Опции XML—разборщика

>
Константа опции Тип данных Описание
XML_OPTION_CASE_FOLDING integer Контролирует, включено ли выравнивание регистра для данного XML-разборщика. По молчанию включено/Enabled.
XML_OPTION_TARGET_ENCODING string Устанавливает, какая целевая кодировка используется для этого XML-разборщика. По умолчанию устанавливается та же, что и кодировка источника, использованная функцией xml_parser_create() . Поддерживаемые целевые кодировки: ISO-8859-1 , US-ASCII и UTF-8 .

Назад Оглавление Вперёд
xml_parser_get_option Вверх xml_set_character_data_handler

Материалы, которые находятся на этой страничке, любезно предоставлены Игорем Ивановым

xml_parser_set_option

xml_parser_set_option — Установка значения настройки XML анализатора

Описание

Устанавливает значение настройки XML анализатора.

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

Ссылка на XML анализатор.

Какую настройку требуется установить. См. ниже.

Доступны следующие настройки:

Настройки XML анализатора
Константа Тип данных Описание
XML_OPTION_CASE_FOLDING integer Требуется ли включить case-folding для этого анализатора. Включено по умолчанию.
XML_OPTION_SKIP_TAGSTART integer Задает количество символов с начала имени тэга, которые следует пропустить.
XML_OPTION_SKIP_WHITE integer Требуется ли пропускать значения, состоящие из пробелов.
XML_OPTION_TARGET_ENCODING string Устанавливает кодировку, которая будет использоваться XML анализатором. По умолчанию используется кодировка заданная при вызове функции xml_parser_create() . Поддерживаются кодировки ISO-8859-1, US-ASCII и UTF-8.

Новое значение настройки.

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

Функция возвращает FALSE , если parser ссылается на недопустимый анализатор или если настройка не может быть установлена. В противном случае устанавливается новое значение настройки и возвращается значение TRUE .

Коментарии

The two ‘skip’ tags are not available to windows users using PHP 4.0.4. The following:

$skipWhite = xml_parser_get_option ($xmlParser,XML_OPTION_SKIP_WHITE);
$skipTagStart = xml_parser_get_option ($xmlParser,XML_OPTION_SKIP_TAGSTART);

generates the following errors:
Warning: xml_parser_get_option: unknown option in c:/program files/abria merlin/apache/htdocs/xml/sax_test.php on line 230

XML_OPTION_SKIP_WHITE works for me (linux, php 4.2.1)

XML Support active
XML Namespace Support active
EXPAT Version expat_1.95.2

i guess it depends on expat version/presence

Had one heck of a time getting curl to send my XML request. Tried a lot of different things, FINALLY ended up with this.

Im making a curl request to paymentech / Orbital ‘s payment gateway. Essentially, I took the same header i made for the fsockopen() request, and used it for this curl request. (Hostinc company didnt allow fsockopen().

You’ll note that this specific gateway requires a custom content type header. Thats what gave me the most trouble. When using the CURLOPT_HTTPHEADER, and CURLOPT_POSTFIELDS together, it doesnt matter, it sends the default post header because of CURLOPT_POSTFIELDS.

= «https://example.com» ;
$page = «/proccessing_page.cgi» ;

$post_string = » All XML stuff Here » ;

$header = «POST » . $page . » HTTP/1.0 \r\n» ;
$header .= «MIME-Version: 1.0 \r\n» ;
$header .= «Content-type: application/PTI26 \r\n» ;
$header .= «Content-length: » . strlen ( $post_string ). » \r\n» ;
$header .= «Content-transfer-encoding: text \r\n» ;
$header .= «Request-number: 1 \r\n» ;
$header .= «Document-type: Request \r\n» ;
$header .= «Interface-Version: Test 1.4 \r\n» ;
$header .= «Connection: close \r\n\r\n» ;
$header .= $post_string ;

$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
curl_setopt ( $ch , CURLOPT_TIMEOUT , 4 );
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST , $header );

$data = curl_exec ( $ch ); if ( curl_errno ( $ch )) <
print curl_error ( $ch );
> else <
curl_close ( $ch );
>

// use XML Parser on $data, and your set!

$xml_parser = xml_parser_create ();
xml_parser_set_option ( $xml_parser , XML_OPTION_CASE_FOLDING , 0 );
xml_parser_set_option ( $xml_parser , XML_OPTION_SKIP_WHITE , 1 );
xml_parse_into_struct ( $xml_parser , $data , $vals , $index );
xml_parser_free ( $xml_parser );

// $vals = array of XML tags. Go get em!

?>

Worked like a dream for me. Enjoy!

A little mod to a function posted here.

function xml_to_array( $file )
<
$parser = xml_parser_create();
xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );
xml_parse_into_struct( $parser, file_get_contents($file), $tags );
xml_parser_free( $parser );

$elements = array();
$stack = array();
foreach ( $tags as $tag )
<
$index = count( $elements );
if ( $tag[‘type’] == «complete» || $tag[‘type’] == «open» )
<
$elements[$index] = array();
$elements[$index][‘name’] = $tag[‘tag’];
$elements[$index][‘attributes’] = $tag[‘attributes’];
$elements[$index][‘content’] = $tag[‘value’];

In the function below, you need to update two lines if you don’t want php to throw warnings.

change these two:
$elements[$index][‘attributes’] = $tag[‘attributes’];
$elements[$index][‘content’] = $tag[‘value’];

to this:
$elements[$index][‘attributes’] = empty($tag[‘attributes’]) ? «» : $tag[‘attributes’];
$elements[$index][‘content’] = empty($tag[‘value’]) ? «» : $tag[‘value’];

The option XML_OPTION_SKIP_WHITE has no effect in my PHP 5.2.6 (with expat-1.95.8-5). To skip cdata composed of white space only, simply check for that at the beginning of your cdata callback function:

function callback_cdata ( $parser , $cdata )
<
if(! trim ( $cdata ))
return;

PHP XML Parser xml_set_default_handler разделяет специальный символ

Парсер XML PHP вызывает функцию обработчика по умолчанию дважды, когда он встречает специальный символ в строке и поэтому разбивает строку. Я пытался решить ее, используя различные кодировки в заголовке XML, а также в коде PHP, но он по-прежнему делит строку:

Можно было бы ожидать, :

Я бы хотел, чтобы линия не разделялась, поэтому любая идея, что такое решение?

Создан 02 янв. 12 2012-01-02 15:49:47 Postie

1 ответ

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

Вы можете справиться с этим, создав собственный класс парсера. Это вообще полезно, в любом случае, не только в этом случае. Но для этого случая это особенно важно, чтобы вы могли собрать текст ярлыка, который распределяется по нескольким событиям.

Основная работа заключается в том, что функция обратного вызова выполняет публичную функцию класса и затем регистрирует эти функции.

Затем каждый раз, когда открывается тег label , временный магазин сбрасывается. Когда текст появляется, он добавляется во временный магазин. Если label тег затем закрывается, вы можете передать этот текст в новое «событие» на этот раз функция, которую вы ищете с его текст:

Создан 02 янв. 12 2012-01-02 16:36:37 hakre

Я хотел бы, чтобы извлечь каждый ‘label’ тег XML в строку и вставить ее в базу данных. Я также пробовал его с помощью ‘xml_set_character_data_handler’, но он дает тот же результат. Это большой XML-файл, содержащий 1000 таких тегов ‘variable’ и’ label’. – Postie 03 янв. 12 2012-01-03 07:05:40

Вероятно, вариант: установите целевую кодировку в UTF-8 — она ​​имеет все символы и не нуждается ни в каких сущностях — и после того, как вы получили текст как UTF-8, перекодируйте его в ISO-8859-1, возможно, с транслитерацией, когда вы выиграли Невозможно вставить каждый символ текста в базу данных как Latin-1. Звучит практично? – hakre 03 янв. 12 2012-01-03 08:24:09

Я пробовал несколько кодировок для цели и источника. Изменено кодирование XML в UTF, но оно все еще не работает. Странно, что он ломается только на первом специальном персонаже. Не знал о классе XMLReader в PHP, изменил код, чтобы использовать этот класс, и это не создает проблем. – Postie 03 янв. 12 2012-01-03 08:50:00

В каком кодировании находится ваш исходный XML-файл/строка? XML Reader в порядке, я скомпилировал некоторый пример кода для пошагового чтения с ним в некотором [(другом) ответе] (http://stackoverflow.com/a/6777403/367456) (только для справки, вы может игнорировать это на мгновение). — Если вы скажете, что исходная кодировка будет полезной для компиляции примера. Также, если бы вы могли добавить код, в который вы «загрузили» этот файл в свой вопрос, было бы более конкретным, чтобы дать лучшие предложения. – hakre 03 янв. 12 2012-01-03 09:38:29

XML находится в кодировке ISO-8859-1, и это экспорт из приложения, поэтому я не контролирую его. Код, который я использую, — ‘while (! Feof ($ fp)) < $ data = fread ($ fp, 4096); xml_parse ($ parser, $ data, feof ($ fp)); >‘ – Postie 03 янв. 12 2012-01-03 11:56:25

Я тоже думал об этом ответе, объединяя строку, но затем я столкнулся с классом XmlReader в PHP и это работает как шарм.Поэтому я переписал класс для использования этого вместо синтаксического анализатора xml. Это также немного быстрее. – Postie 05 янв. 12 2012-01-05 13:23:56

Хорошо, я связал XMLReader выше;) При компиляции кода примера я сначала хотел использовать его, но я думал, что вам нужен xml_parser. Так играет жизнь;) – hakre 05 янв. 12 2012-01-05 13:53:52

Илон Маск рекомендует:  Как в Word зачеркнуть слово
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL