PHP::SimpleXML. Часть 2. XML дерево

В заключительной части цикла статей посвященного работе с SimpleXML, будет рассмотрена довольно распространенная задача: построение XML дерева.

Требования

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

Для того, что бы лучше понять, что же все-таки мы хотим сделать, можно посмотреть на уже готовый пример: http://st-programming.ru/simple_xml/index.php

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

Дерево представляет собой обычный вложенный список. Для добавления функциональности (сворачивание и разворачивание) и нормального внешнего вида используется плагин для JQueryTreeview (скачать)...

xml, алгоритмы, php, jquery

PHP::SimpleXML. Часть 1. Введение в SimpleXML

В данном цикле статей будет рассмотрено SimpleXML – расширение PHP для обработки XML. Для начала разберем основные методы, потом напишем простенький скрипт – построение дерева на основе XML файла.

Для наглядности,  в качестве примера будем использовать XML, описывающий простой кулинарный рецепт, взятый с википедии :)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <recipe name="хлеб" preptime="5" cooktime="180">
  3.   <title>Простой хлеб</title>
  4.   <ingredient amount="3" unit="стакан">Мука</ingredient>
  5.   <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>
  6.   <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient>
  7.   <ingredient amount="1" unit="чайная ложка">Соль</ingredient>
  8.   <instructions>
  9.    <step>Смешать все ингредиенты и тщательно замесить.</step>
  10.    <step>Закрыть тканью и оставить на один час в тёплом помещении.</step>
  11.    <step>Замесить ещё раз, положить на противень и поставить в духовку.</step>
  12.   </instructions>
  13. </recipe>

Загрузка XML

Прежде чем начать обрабатывать данные, их нужно сначала получить :). Для того что бы проанализировать XML документ и сохранить его в переменной достаточно использовать функцию simplexml_load_file(). Она принимает имя файла, и возвращает объект типа SimpleXMLElement (либо наследуемого от него). И с этим объектом уже можно будет работать.

$xml = simplexml_load_file("tmp.xml");

Кроме того, существует еще и функция simplexml_load_string, которая берет XML не из файла, а из строки.

Следует отметить, что получаемый в итоге объект – это и есть корневая ветвь документа...

xml, php

Delphi::Система тестирования. Часть 2. Работа с данными

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

Структура XML файла

Рассмотрим структуру XML файла, в незашифрованном виде, на примере:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <test text="Delphi" qcount="0">
  3.     <question text="Delphi - объектно ориентированный язык?" active="true">
  4.         <answer right="False" text="нет"/>
  5.         <answer right="true" text="да"/>
  6.     </question>
  7.     <question text="Какая функция или процедура выполнит
  8.                     преобразование string в integer?" active="true">
  9.         <answer right="true" text="StrToInt"/>
  10.         <answer right="true" text="Val"/>
  11.         <answer right="false" text="StringToInteger"/>
  12.     </question>
  13.     <question text="Есть ли в Delphi динамические массивы?" active="false">
  14.         <answer right="false" text="Да, были в Delphi с самой первой версии"/>
  15.         <answer right="false" text="Нет"/>
  16.         <answer right="true" text="Да, появились с версии 4"/>
  17.     </question>
  18. </test>

Как видно, test  - корневая ветвь документа. Ее атрибуты:

  • Text – название теста
  • Qcount– количество используемых вопросов. Если 0, тогда используются все вопросы из файла.

Вопросом является ветвь question, которая является родительской для ветви answer – варианта ответа. Рассмотрим атрибуты вопроса:

  • Text – сам текст вопроса.
  • Active– флаг, определяющий является ли вопрос активным (будет ли использован в тесте)

Вариантов ответа может любое количество. Притом опять же любое количество из них может быть верным. Атрибуты:

  • Right – флаг, определяющий является ли вариант ответа верным или нет.  
  • Text – текст варианта ответа.

Данные

Весь код, который мы будем использовать для работы с xml файлом и данными из него целесообразно определить в один unit. Назовем его StData и положим в папку lib, так как с данными должны работать и представление и администрирование.

Перед тем как начать писать код, разбирающий XML нужно понять, как мы будем представлять данные и, собственно, с какими данными будем работать. Исходя из структуры XML файла, можно выделить следующее: сам тест (название и количество вопросов), вопрос (текст и активность) и вариант ответа (правильность и текст). Все это можно представить в виде классов. То есть получить классы TStTest, TStQuestion и TStAnser для теста, вопроса, и варианта ответа соответственно.  

Удобно будет, если вопрос будет хранить список вариантов ответа, а вариант ответа, знать какому вопросу он принадлежит.

Учитывая вышесказанное, получаем следующие классы:...читать дальше

delphi, тест, xml, паттерны