Тест по PHP — Работа с XML


Работа с XML средствами PHP

Давайте начнем с самого простого: загрузки и выгрузки XML-документа с использованием DOM. Основной класс, который мы будем использовать, это DOMDocument. Через него можно создавать новые документы, сохранять их, а также загружать существующие.

Как получить список дочерних узлов

Свойство nodeName содержит название элемента (в данном случае, item ), а nodeValue содержимое элемента (в данном случае, « Первый » и « Второй »).

Работа с атрибутами узлов

Давайте посмотрим, как получить значение атрибута узла, устанавить новое значение, создать и удалить атрибут:

Взаимодействие PHP и XML

Введение

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

В качестве примера рассмотрим XML — файл , содержащий описания личностей, и попытаемся научиться добавлять, удалять и находить личность или отдельные элементы ее описания в этом файле с помощью PHP .

Основные понятия

XML (Extensible Markup Language) – это расширяемый язык разметки, являющийся подмножеством языка SGML и поэтому имеющий общие с ним цели – разметка любого типа документов.

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

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

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

которая указывает на версию языка XML (атрибут version), кодировку текста в этом документе (атрибут encoding ) и показывает, существует ли документ сам по себе или зависит от других файлов (атрибут standalone ).

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

Пусть у нас имеется письмо. Содержащуюся в нем информацию можно хранить в следующем виде:

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

С помощью XML можно создать документ для описания любой информации. Для того чтобы другие разработчики могли создавать документы в этом же XML -языке (т.е. используя те же теги) и чтобы можно было проверить правильность созданного документа (его соответствие выбранному XML -языку), нужно формально описать используемый XML -язык. Это делается с помощью механизмов DTD (Document Type Definition) или Schemas , которые дают возможность создавать шаблоны для новых типов документов. Для экспериментов в домашних условиях создавать DTD -описания необязательно. Важно понимать, что XML на самом деле вовсе не язык, а стандарт для создания языков, отвечающих критериям XML .

Между XML-документами могут быть установлены ссылки, один документ может включать в себя другой, т.е. структура документа может быть сколь угодно сложной.

Элементы в XML -документах могут быть связаны между собой отношениями родитель/потомок или родственник/родственник. В нашем примере является родителем , который в свою очередь является потомком , а , и являются родственниками. Собственно текст тоже является потомком элемента , например, » Вася Иванов » – потомок элемента . Такая структура называется деревом; любые части дерева, имеющие потомков , называются ветвями, а не имеющие – листьями.

Тест на php

Необходимо сделать простенький тест на php, но вот вопрос — как его делать, куда складывать переменные, нужно би подключать его к бд? форму то я накидал как на картинке.

31.05.2014, 16:29

php-тест
Вообщем нужно сделать тест на php для сайт, благо интернет большой нашел готовый php тест, правда.

Тест по php
Мне нужно создать тест. Вопросы уже есть. И там должен будет быть вход на сайт(регистрация.

Тест на PHP
Здравствуйте, уважаемые! Возникла задача в написании простого теста с выбором варианта. Затем.

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

Написать тест на PHP
Здравствуйте! Написал тест. Всё хорошо работает. Но дали задание дополнить его:» Если на вопрос не.

31.05.2014, 17:03 2 31.05.2014, 19:25 [ТС] 3

pav1uxa,
Спс- все получилось! Я создал тест, создал обработчик ответов в другом php- файле

Примерно так вот и создал. На один вопрос все нормально работает.

Но теперь встала проблема такая- Для перехода к следующему вопросу кинул кнопку на странице где юзер уже читает ответ на вопрос. И чо получается-вопрос то тот-же там висит! Как его заменить непойму ни как.

Я так понял мне нужна какая-то переменная, которая будет номером вопроса так сказать, и при переходе на страницу с вопросами- переменная должна плюсоваться на 1! а как это сделать то?

Добавлено через 9 минут
И еще что я понял- мне вопросы в переменных или в базе нужно держать, что бы дать возможность им менятся на главной странице теста?
Ну типа если вопрос ==1 то мы, даже не вопрос а билет! Если билет ==1 то мы первых три вопроса, если билет == 2, то мы следущих три вопроса ставим?

Добавлено через 23 минуты
pav1uxa,
Можно конечно сделать и так что на одной странице пользователь отвечает на все 10 билетов в каждом из которых по 3 вопроса, а затем по кнопке ответить- отправляется на обработчик, где все переменные обработаются разом! и юзер получит готовый ответ о своих ошибках и база заполнится нужными полями и на этом можно считать что программа тест полностью создана!

Но как-то пихать все в одну кучу неочень охота.

Тесты на знание Web-технологий

Теперь на сайте доступно тестирование на знание следующих тем: HTML, CSS, JavaScript, PHP, SQL.

Каждый тест состоит из 10-ти вопросов по определённой теме. Я старался в каждом вопросе затрагивать самые разнообразные области применения конкретного языка, чтобы максимально тщательно проверить Ваш уровень знаний.

Безусловно, все тесты бесплатные и пройти их может любой желающий.

Порядок прохождения теста:

  1. Переходите по ссылке «Начать тестирование» у соответствующего теста.
  2. Отвечаете на поставленные вопросы, выбрав единственный правильный вариант.
  3. По завершению тестирования Вы увидите свой балл, количество ошибок, а также разбор каждого вопроса из теста.

Внимание! Вернуться к предыдущему вопросу не получится, поэтому прежде, чем отвечать, думайте.

Доступные на данный момент тесты

  • Всего тест прошло: 73127 человек
  • Средний балл: 2.84 из 5 баллов.

Тест на знание основ HTML. От Вас потребуется знание основных HTML-тегов, а также грамотное их использование. Так же необходимо понимание особенностей стандарта XHTML 1.1.

  • Всего тест прошло: 31906 человек
  • Средний балл: 3.37 из 5 баллов.

Тест проверяет знания по основам CSS. Для успешного прохождения теста Вы должны знать основные виды селекторов (их синтаксис), знать основные свойства и их возможные значения, а также знать назначение самых популярных псевдоэлементов.

JavaScript

  • Всего тест прошло: 24397 человек
  • Средний балл: 3.31 из 5 баллов.

Данный тест проверяет Ваши знания по языку JavaScript. Вопросы из теста затрагивают разные области применения данного языка. Очень много вопросов имеется на понимание «мелких» нюансов. В остальном же от Вас требуется знание базовых вещей: работа с переменными, основные функции JavaScript, приоритеты операций и прочее.

  • Всего тест прошло: 32851 человек
  • Средний балл: 3.03 из 5 баллов.

Данный тест проверяет Ваши знания по языку PHP. От Вас требуется знание основных конструкций PHP, работы с переменными, сессий, реализации редиректа и прочих стандартных вещей.
Убедительная просьба: В тесте содержится много вопросов по типу: «Что выведет скрипт?». Большая просьба, не надо копировать его и проверять. Будьте честны перед самими собой.

  • Всего тест прошло: 17853 человека

  • Средний балл: 3.29 из 5 баллов.

Данный тест проверяет Ваши знания по языку запросов SQL. Вопросы затрагивают только самые базовые знания этого языка, без какого-либо углубления. От Вас потребуется знание самых основных SQL-запросов, а также грамотное их использование.

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

Тесты PHP

Основы

Тест по основам языка PHP. Чтобы пройти тест, повторите основные теги, функции и параметры.

Функции и массивы

Тест проверит вас на знание функций и массивов в PHP. Перед началом теста повторите их.

Классы и объекты

Тест проверит вас на знание классов и объектов в языке PHP. Прежде чем приступить к тесту повторите свои знания в этой области.

Классы и объекты PHP продолжение

Продолжение теста по класам и объектам в языке PHP. Тесты в этом вопросе несколько усложнены.

Цукерберг рекомендует:  Beginner - Помогите поднять Zend 2 проект

Контрольные вопросы

Контрольные вопросы для итоговой проверки знаний языка PHP.

Тест по PHP — Работа с XML

БлогNot. Пишем простой тест на PHP

Пишем простой тест на PHP

Этот учебный скрипт на PHP показывает, как можно описать некий тест в виде единственного массива вопросов и ответов. Поскольку типов вопросов может быть несколько (выбор «да»-«нет», выбор одного из нескольких вариантов, ввод числа или строки в качестве ответа), нам понадобится не просто массив, а массив массивов, каждый элемент которого будет описывать всё, что нужно для вывода и проверки очередного вопроса. Это будут записи со следующими ключами:

  • ‘q’ — отображаемый текст вопроса;
  • ‘t’ — тип вопроса, соответствующий нужному тегу HTML: ‘checkbox’ для галочек «да/нет», ‘text’ для строки или числа в качестве ответа, ‘select’ — для списка, в котором нужно выбрать одно значение из нескольких. Выбор более одного значения реализуем придуманным нами элементом ‘multiselect’ , представляющим из собой группу вместе обрабатываемых checkbox’ов. На самом деле, стандартный список с атрибутом multiple тоже позволяет решить эту задачу, но не хотелось бы загружать пользователя необходимостью помнить, что множественный выбор из списка делается при зажатой клавише Ctrl;
  • ‘a’ — правильный ответ, для checkbox это значение ‘1’ или ‘0’ (нужно ли включать галочку), для text — строка с ответом (длину поля будем генерировать равной длине строки с правильным ответом, так что контроль лишних разделителей и проч. опустим), для select — номер варианта в списке, который является правильным ответом (варианты нумеруются с нуля!), для multiselect — строка из единиц и нулей, разделённых символом » | «, показывающая, какие по порядку чекбоксы нужно включить, а какие не нужно;
  • ‘i’ — элементы списка, нужные только для типов вопроса select и multiselect , значение содержит строки, разделённые символом » | » (элементы списка или варианты утверждений).

За каждый правильный ответ, в том числе, выбор всех «правильных» чекбоксов в ‘multiselect’, будет начисляться 1 балл, а в конце скрипт выдаст резюме о количестве и проценте правильных ответов.

В отличие от простого конвертера, в этом скрипте мы не ставили задачи сохранить пользовательский ввод, поэтому ссылка «Ещё раз!» на странице с результатами позволяет просто пройти тест повторно, введя все результаты и отметив все чекбоксы заново. Несмотря на это, программке понадобилось 2 дополнительных функции:

  • error_check проверяет, всё ли хорошо с очередным элементом массива $test , и, если что-то не так, завершает выполнение скрипта. Это может пригодиться при отладке;
  • strlwr_ переводит в нижний регистр строки, введённые пользователем в качестве ответов. Предполагается кодировка Windows-1251, но можно, конечно, вставить текст скрипта в файл с другой кодировкой и поменять мета-тег кодировки в заголовке.

Вот полный исходник приложения, содержащий тест всех 4 типов вопросов:

Ниже показан вид теста и результат его прохождения.

Как создать онлайн тест на php

Иногда людям не знающим программирования, нужно создать онлайн тест на php для своего сайта, на самом деле все очень просто, постараюсь наглядно объяснить.

Для решения данной задачи мы будем использовать простую HTML форму и POST запросы. И так приступим.

1. Нам потребуется создать файл php, в общем по сути не важно, если вы используете CMS, то пишете там, где можно вставить php код.

2. Создадим простую форму с полями «radio», то есть для выбора вариантов ответа и кнопкой для результатов.

В результате получим:

3. Отлично мы создали форму. Теперь в неё нужно внести изменения, чтобы она работала.

Добавим атрибуты к форме.

method=»POST» — метод отправки php форм.

action=»result.php» — файл, в который будут отправляться результаты формы.

4. Присвоим уникальное имя вариантам ответов, чтобы объединить их между собой, для одного вопроса — name = «имя»:

5. А теперь пропишем имя ответов к каждому варианту, например ‘value = «a»‘

В результате получим:

6. Создадим файл result.php в том же каталоге, в котором создадим скрипт теста на php для обработки и вывода результата правильных и не правильных ответов.

7. Перед html кодом добавим скрипт php:

Описание: Здесь все довольно просто, мы создаем простое условие для каждого вопроса. Если в вопросе [q1] вариант «a», то прибавляем к переменной «$ot» + 1 ($ot — количество правильных ответов), если другой вариант то записываем в переменную $not «неправильных ответов» + 1.

8. Теперь выводим на страницу в html коде правильные и неправильные ответы:

Заключение. Теперь у вас есть простой тест на php и html, теперь можно и запустить его для онлайн. Вы можете добавить сколько угодно вариантов ответов по аналогии. Добавить стилей и улучшить код. Можно было все сделать намного грамотней, но проще этого не придумаешь. Работа у теста такая: выбрали варианты, нажали на кнопку «результат», нас перекидывает на вторую страницу, где выводится подсчет правильных и неправильных ответов. Удачи!

С помощью POST-запроса можно реализовать обратную форму, о том, как это делается читайте в статье — Форма обратной связи php без спама.

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, но реализация и этого подхода сопряжена с преодолением значительных сложностей.

Цукерберг рекомендует:  C# - Компонент Chart для MonoDevelop

Поэтому в настоящее время остается наиболее перспективным такое основное направление применения языка 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

интеграционное тестирование — Как правильно тестировать php-репозитории

Я пытаюсь написать интеграционные тесты для своих репозиториев. Для простых репозиториев это кажется легким. Я сделал что-то подобное

Запрос о хранилище статуса должен возвращать объект статуса.

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

Этот фрагмент кода также проверяет все пройденные зависимости. Я не уверен, что это нормально.

Также при настройке репозитория у нас может быть дерево зависимостей, подобное этому:

Это правильный подход для проведения интеграционного тестирования для репозиториев?

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

Решение

На самом деле, насколько я понимаю, в интеграционном тесте вы хотели бы проверить свой репозиторий с реальными границами.

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

Вы можете сделать это вручную или с помощью DBUnit

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

с DBUnit вы можете создавать файлы XML / CSV / YAML, в которых вы определяете данные, а DBUnit автоматически выполняет вставки и очистки.

Как проверить xml с php

Я сделал api с xml-запросом для моего сайта.

но иногда некоторые клиенты отправляют мне недопустимый xml, и я хочу вернуть хороший ответ.

как я могу проверить XML?

отредактирован:

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

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

это мой пример xml:

К сожалению, XMLReader не подтвердил много вещей в моем случае.

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

Он отлично работает с потоками и vfsStream, а также для целей тестирования.

Документация PHP имеет именно то, что вам нужно!

Я уверен, что вы уже определили правильный DTD, правильно?

Цукерберг рекомендует:  Обучение - Ошибка Uncaught SyntaxError Unexpected token else
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих