Что такое код xml_parse_into_struct


Как использовать xml_parse_into_struct() — xml

Я пытаюсь использовать xml_parse_into_struct() , но он возвращает false

Мой код выглядит так:

$contenido выглядит так

Моя проблема в том, что оператор if не возвращает true, Любая идея, в которой я ошибаюсь

    2 1
  • 30 июл 2020 2020-07-30 09:16:15
  • Vikram

1 ответ

Это связано с тем, что у вас слишком много ошибочных тегов в вашем XML, начинающемся справа вверху с помощью . . Это приведет к возврату 0.

Кроме того, xml_parse_into_struct() возвращает 1 или 0, которые действительно не должны ошибочно приниматься за истину и ложь. Из документов,

xml_parse_into_struct() возвращает 0 для отказа и 1 для успеха. Это не то же самое, что FALSE и TRUE, будьте осторожны с операторами, такими как ===.

Учитывая это, вы должны выполнить тест явно:

xml_parse_into_struct

Parse XML data into an array structure

Description


This function parses an XML string into 2 parallel array structures, one ( index ) containing pointers to the location of the appropriate values in the values array. These last two parameters must be passed by reference.

Parameters

A reference to the XML parser.

A string containing the XML data.

An array containing the values of the XML data

An array containing pointers to the location of the appropriate values in the $values.

Return Values

xml_parse_into_struct returns 0 for failure and 1 for success. This is not the same as FALSE and TRUE , be careful with operators such as ===.

Examples

Below is an example that illustrates the internal structure of the arrays being generated by the function. We use a simple note tag embedded ins >

Example #1 xml_parse_into_struct example

» ;
$p = xml_parser_create ();
xml_parse_into_struct ( $p , $simple , $vals , $index );
xml_parser_free ( $p );
echo «Index array\n» ;
print_r ( $index );
echo «\nVals array\n» ;
print_r ( $vals );
?>

When we run that code, the output will be:

Event-driven parsing (based on the expat library) can get complicated when you have an XML document that is complex. This function does not produce a DOM style object, but it generates structures amenable of being transversed in a tree fashion. Thus, we can create objects representing the data in the XML file easily. Let’s cons >

Example #2 moldb.xml — small database of molecular information

Example #3 parsemoldb.php — parses moldb.xml into an array of molecular objects

class AminoAcid <
var $name ; // aa name
var $symbol ; // three letter symbol
var $code ; // one letter code
var $type ; // hydrophobic, charged or neutral

function AminoAcid ( $aa )
<
foreach ( $aa as $k => $v )
$this -> $k = $aa [ $k ];
>
>


function readDatabase ( $filename )
<
// read the XML database of aminoacids
$data = implode ( «» , file ( $filename ));
$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 , $data , $values , $tags );
xml_parser_free ( $parser );

// loop through the structures
foreach ( $tags as $key => $val ) <
if ( $key == «molecule» ) <
$molranges = $val ;
// each contiguous pair of array entries are the
// lower and upper range for each molecule definition
for ( $i = 0 ; $i count ( $molranges ); $i += 2 ) <
$offset = $molranges [ $i ] + 1 ;
$len = $molranges [ $i + 1 ] — $offset ;
$tdb [] = parseMol ( array_slice ( $values , $offset , $len ));
>
> else <
continue;
>
>
return $tdb ;
>

function parseMol ( $mvalues )
<
for ( $i = 0 ; $i count ( $mvalues ); $i ++) <
$mol [ $mvalues [ $i ][ «tag» ]] = $mvalues [ $i ][ «value» ];
>
return new AminoAcid ( $mol );
>

Xml_parse_into_struct

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

[1] => Array ( [tag] => KABAK [type] => open [level] => 2 [attributes] => Array ( [ID] => 0 ) [value] => ). [20] => Array ( [tag] => KABAK [value] => [type] => cdata [level] => 2 ) [21] => Array ( [tag] => KABAK [value] => [type] => cdata [level] => 2 ) [22] => Array ( [tag] => TEL [type] => complete [level] => 3 [value] => 123-456 ) [23] => Array ( [tag] => KABAK [value] => [type] => cdata [level] => 2 ) [24] => Array ( [tag] => KABAK [value] => [type] => cdata [level] => 2 ) [25] => Array ( [tag] => TEL [type] => complete [level] => 3 [value] => 654-321 ) [26] => Array ( [tag] => KABAK [value] => [type] => cdata [level] => 2 ) [27] => Array ( [tag] => KABAK [value] => [type] => cdata [level] => 2 ) [28] => Array ( [tag] => KABAK [type] => close [level] => 2 ) .

Преобразование XML в JSON с помощью xml_parse_into_struct

Я работаю над сервером, на котором нет простого XML-файла PHPXX, и вам нужно преобразовать XML-строку в JSON, поэтому я использую xml_parse_into_struct() , чтобы выполнить эту работу. Затем я пытаюсь объединить два массива, которые он создает с помощью array_combine() , а затем использовать json_encode() , чтобы вернуть представление JSON строки XML. Проблема, с которой я сталкиваюсь, заключается в том, что два массива xml_parse_into_struct() создают не равные длины, поэтому array_combine() выдает ошибку. Я считаю, что это может быть вызвано XML-строкой, содержащей кучу элементов с тем же именем. Как преобразовать эту строку xml в JSON и сохранить все элементы и их атрибуты без simpleXML?

Илон Маск рекомендует:  Иерархическое группирование

Преобразование XML в JSON с помощью xml_parse_into_struct

Я работаю на сервере , который не имеет SimpleXML в PHP доступны и нужно преобразовать XML — строку в JSON , так я использую , xml_parse_into_struct() чтобы получить работу. Я тогда пытаюсь объединить два массива , которые она производит с , array_combine() а затем использовать json_encode() для возвращения JSON представления строки XML. Проблема у меня в том , что два массива xml_parse_into_struct() создает не одинаковую длину , так array_combine() бросает ошибку. Я считаю , что это может быть вызвано строкой XML , имеющей кучу элементов с таким же именем. Как я могу преобразовать это XML — строку в JSON и сохранить все элементы и их атрибутов без SimpleXML?

Рассмотрим манипулируя $vals массив далее счет для вложенной структуры дерева (братьев и сестер, детей и т.д.). Как есть, xml_parse_struct () возвращает объекты все в одном уровне с только атрибутами , как вложенный массив. Ниже использует этот сырой массив вывода и дизайна XML дерева, определяет другие массивы с соответствующими значениями для вложенной структуры.

PHP скрипт

Довольно для печати в формате JSON Output ( в соответствии с интернет — источников , является допустимым JSON)

Противоположность xml_parse_into_struct?

Я пытаюсь написать ряд функций, которые будут извлекать документ.xml-часть файла MS Word DOCX и эффективное почтовое слияние ряда пар ключ / значение для замены определенных полей шаблона в документе. У меня есть функция, которая использует xml_parse_into_struct для преобразования текста XML в необходимые массивы, но как только я закончу с заменой текста, мне (предположительно) нужно будет использовать ZipArchive метод addFromString для создания нового документа.xml-файл и добавить его в контейнер docx zip. Но я не уверен, как это сделать, когда я работаю с массивом данных, а не строкой XML. Есть ли способ преобразовать массив обратно в формат строки XML?

Вот что у меня есть до сих пор:

Эта часть работает хорошо, я могу print_r как массивы и смысл результатов. Однако следующая функция не работает — по крайней мере, не во всех случаях. Если я использую определенные разделители для полей, которые будут заменены, это работает, но не все время, которое я предполагаю, является проблемой с кодировкой символов Word или другим форматированием.

Поэтому вместо того, чтобы использовать str_replace (который часто терпит неудачу), я планировал задействовать массив $vals, который я получаю от первой функции, делая замену там, а затем сохраняя результирующий массив обратно в строку и, в свою очередь, обратно в контейнер docx zip.


1 ответ

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

Что такое код xml_parse_into_struct

Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71

int xml_parse_into_struct (resource parser, string data, array &values, array &index)

Ну в принципе описание я читал, но хотелось бы знать какие ключи бывают (array &values) и какие значения могут быть.
Что-то не нашёл описание подробное

Я знаю только
— tag
— type => open/complete/cdata/close
— level
— value
— attributes

Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 4
Всего: 53

Irokez
Дата 8.8.2005, 13:37 (ссылка) | (нет голосов) Загрузка .
Илон Маск рекомендует:  Вывод окна предупреждения в элементе DIV

Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71

Вот там то особо и нет.. Есть в примерах, как это используется, а хотелось описания посерьёздней
Добавлено @ 13:54

и ещё у меня плоховато с инглишь

Gold Dragon
Дата 8.8.2005, 13:52 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004


Репутация: 4
Всего: 53

Irokez
Дата 8.8.2005, 14:14 (ссылка) | (нет голосов) Загрузка .
Цитата(Red @ 8.8.2005, 13:52)
Вот там то особо и нет.. Есть в примерах, как это используется, а хотелось описания посерьёздней

а что именно тебе там не понятно?
функция принимает следующие параметры:
ссылка (ресурс) на XML парсер
строка — сам XML
массив — значения
массив — индексы

в массив значений запишутся подряд теги, как они встречаются в XML документе и данные по ним:
tag — имя тега
type — тип (открывающий, закрывающий, законченный — пустой)
level — уровень вложенности в документе
value — значение тега

в массив индексов будет список тегов, сгруппированных по названию и порядок под которым они встречаются в документе

Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71

например, что значит cdate?

Вот к примеру массив $vals

Gold Dragon
Дата 8.8.2005, 14:46 (ссылка) | (нет голосов) Загрузка .
Код
[1] => Array (
[tag] => KABAK
[type] => open
[level] => 2
[attributes] => Array (
[ID] => 0 )
[value] => )
.
[20] => Array (
[tag] => KABAK
[value] =>
[type] => cdata
[level] => 2 )
[21] => Array (
[tag] => KABAK
[value] =>
[type] => cdata
[level] => 2 )
[22] => Array (
[tag] => TEL
[type] => complete
[level] => 3
[value] => 123-456 )
[23] => Array (
[tag] => KABAK
[value] =>
[type] => cdata
[level] => 2 )
[24] => Array (
[tag] => KABAK
[value] =>
[type] => cdata
[level] => 2 )
[25] => Array (
[tag] => TEL
[type] => complete
[level] => 3
[value] => 654-321 )
[26] => Array (
[tag] => KABAK
[value] =>
[type] => cdata
[level] => 2 )
[27] => Array (
[tag] => KABAK
[value] =>
[type] => cdata
[level] => 2 )
[28] => Array (
[tag] => KABAK
[type] => close
[level] => 2 )
.

Вот xml

Код

Roga i Kopyta

Нижний Новгород

Larina

123-456
654-321

Почему 20 и 21, 23 и 24 повторяются?

Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 4
Всего: 53

Red Dragon
странно что он вообще стал парсить.. добавь в начале:

Irokez
Дата 8.8.2005, 14:58 (ссылка) | (нет голосов) Загрузка .
Код

Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71


Почему странно? Это сокращённый код.

Вот мой код..

Gold Dragon
Дата 8.8.2005, 15:15 (ссылка) | (нет голосов) Загрузка .
Код

test.xml

Код

Roga i Kopyta

Нижний Новгород

Larina

123-456
654-321

Добавлено @ 15:16
так что означает ?

Код
.
[. ] => Array (
[tag] => KABAK
[value] =>
[type] => cdata
[level] => 2 )
.

Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317

Sardar
Дата 8.8.2005, 20:28 (ссылка) | (нет голосов) Загрузка .
Цитата(Red @ 8.8.2005, 13:46)
например, что значит cdate?

CDATA секция, стандарт XML. Только что то я не заметил этих секций у тебя в XML.

xml_parse_into_struct не делает тебе удобный массив с тегами, он просто кидает поток SAX событий(теги, текст и т.д.) в массив. Кстати CDATA, entities и текст PHP’шный SAX парсер отдаёт как characterData, сам преобразовывая entities( | (нет голосов) Загрузка .

Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71

Sardar
И зачем мне эти секции? Мне не понятно зачем идут одинаковые два значения в массиве, которые по логике не несут данных вообще, т.е. и так понятно что тег вложен

По мне, open открывает тег, close — закрывает, complete — теги с содержанием, а CDATA — вопрос
Добавлено @ 08:05

Цитата(Sardar @ 8.8.2005, 20:28)
xml_parse_into_struct не делает тебе удобный массив с тегами,

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

Правда есть маленький вопрос не совсем по теме. есть ли органичения на размер массива и какова скорость его обработки?

Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Символ, введенный пользователем, разбивает xml-декодирование, выполненное xml_parse_into_struct.


спасибо за ответ! Речь идет о PHP/MySQL

Пользователь вводит текст, который затем обрабатывается через htmlentities() :

Эта запись хранится в XML:

файл XML хранится в базе данных в формате UTF-8. HTML для сайта также устанавливается с UTF-8.

То, что мы наблюдали это с конкретным входом, XML, которые обрабатываются:

не обрабатывается должным образом в xml_parse_into_struct() .

Что мы видим в базе данных является следующее:

Создан 07 сен. 11 2011-09-07 00:25:20 Samuel

Вы должны отступа ваш кода, чтобы он корректно отображался (читайте faq). в любом случае. Вы проверили строку, которую вы сохраняете в базе данных, прежде чем вы ее сохранили? Проблема может быть связана с htmlentities, а не с хранилищем данных. – SublymeRick 07 сен. 11 2011-09-07 00:43:50

htmlentities работает в нашей базе данных, где он не хранит xml, но когда он попадает на записи, хранящие xml, htmlentities перестает работать. может быть, нам нужен DTD? – Samuel 07 сен. 11 2011-09-07 01:30:45

То, что вы показываете в своем вопросе, является абсолютно корректным XML. Какую проблему вы видите? Является ли acirc + euro + right двойной цитатой байтов кодировки UTF-8 чего-то еще? – Ray Toal 07 сен. 11 2011-09-07 01:35:42

просто попробовал, что фил это не сработало – Samuel 07 сен. 11 2011-09-07 01:41:11

@Samuel Как выглядит исходная строка ‘$ userinput’? – Phil 07 сен. 11 2011-09-07 02:07:55

Мы пробовали много разных специальных символов, и все они не работали. даже авторский знак ‘©’ не работал! – Samuel 07 сен. 11 2011-09-07 02:19:43

Львиная доля сущностей, созданных ‘htmlentities’ (в том числе’ â ‘), недействительна в стандартном XML-стандарте. Что именно вы подразумеваете под «неправильной обработкой?» Есть предупреждения? – John Flatness 07 сен. 11 2011-09-07 03:00:03

Методы работы с «тяжёлыми» 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 отлично работает с аттрибутами тэгов.

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

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

PHP xml_parse_into_struct() Function

Определение и использование

xml_parse_into_struct() функция анализирует данные XML в массив.

Эта функция анализирует XML-данные в 2 массивы:

  • Массив значений — содержащие данные из разобранного XML
  • Индекс массив — содержащие указатели на расположение значений в массиве Value

Эта функция возвращает 1 в случае успеха, или 0 в случае неудачи.

Синтаксис

Sardar
Дата 9.8.2005, 15:41 (ссылка) | (нет голосов) Загрузка .
параметр Описание
parser Необходимые. Указывает XML-парсер, чтобы использовать
xml Необходимые. Определяет данные XML для разбора
value_arr Необходимые. Определяет целевой массив для данных XML
index_arr Необязательный. Определяет целевой массив для индекса данных

Советы и примечания

Note: xml_parse_into_struct() функция возвращает 1 для успеха и 0 для отказа. Это не то же самое, как ИСТИНА и ЛОЖЬ.

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