КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Объявление атрибута ⇐ ПредыдущаяСтр 2 из 2
Пример
Элемент pricelist может содержать два атрибута – атрибут id и атрибут name. При этом атрибут id является обязательным, так как указано #REQUIRED, а атрибут name – не обязательным (указано #IMPLIED). В свою очередь CDATA указывает обработчику, что разбирать содержимое атрибутов не нужно. Модификаторы (объясняют повторения элементов) * — ноль или много. Пример
Элемент books может содержать один или более элементов book.
Нужно решить проблему с разбором конструкции. Стратегии работы с XML: 1. DOM (Document Object Model) - объектная модель документа 2. SAX
1. DOM Парсер разбирает XML-документ и создаёт в памяти дерево. Element / \ TagElement TextElement
struct Element{ Element *parent; std::list<Element*> children; }; Это не означает, что любой XML-парсер написан с помощью применения шаблонов и STL. Могут быть разные реализации. Дерево, каждый элемент которого хранит указатель на родителя и список своих детей. Если у тега есть вложенные теги, они являются его детьми. У тега <point> дети <x>, <y> и <z>. У тега <points> ребёнок - <point>.
Про наследников: struct TagElement : Element { std::string name; // имя тега (point, line) std::map<string, string> attribs; // ассоциативный массив для атрибутов тега (пары имя атрибута - значение атрибута) };
struct TextElement : Element{ std::string value; // значение }; <x> 1.0 </x>
Парсер представит документ в виде дерева и предоставит функции, чтобы по этому дереву ходить. Можно попросить корень дерева, у корня дерева попросить всех детей, можно просить у узла "соседей".
Плюсы и минусы такого подхода Плюсы: 1) если есть большой документ с разрозненными элементами (например, хранение схемы), то лучше использовать DOM. Он позволяет вернуться назад, пройти по дереву и т.д. Минусы: 1) если XML-документ большой, то нужно много памяти, чтобы хранить документ (примерно в 4 раза больше, чем документ) Если есть большой документ, а из него нужен только маленький кусочек в середине, то пользоваться DOM не очень хорошо, т.к. на это уходит много памяти.
Если XML-файл простой, что не нужно бегать туда-сюда при его интерпретации, либо когда в большом документе нужна только небольшая часть в середине и не хочется тратить память под всю эту структуру, нужно пользоваться SAX.
2. SAX simple API for XML Парсер бежит по документу, и как только встречается нужный элемент, вызывается функция. Память, которая нужна этому парсеру - О(1), т.е. он ничего не сохраняет: чтение строки, разбор на части, и вызов функции. При этом идёт последовательная обработка, т.е. нельзя вернуться назад.
У конкретных парсеров синтаксис может быть разным. struct Handler { //обработчик virtual void startTag(string& name, map<string, string>& attribs) = 0; // функция будет вызвана, когда будет встречен закрывающий тег vitrual void endTag(string& name) = 0; // функция будет вызвана, когда будет встречено содержимое virtual void chars(string &text); };
Если нужно вывести имена всех тегов на экран. struct MyHandler : Handler{ void startTag(...){ printf("%s\n", name.c_str()); } void endTad(...) { } void chars(...) { } };
Как этим пользоваться? int main(){ Handler *h = new MyHandler(); sax_parser(h, "a.xml"); // указатель на класс обработчика и имя файла }
sax_parser(const Handler* h, const string& file){ char str[1024]; file f(file); while(не конец файла){ f.readline(str); // нужно строчку разобрать if(в str начало тега) h->startTag(..); } }
Память нужна только на текущую строку.
Библиотеки Xerces expat (sax) достоинство - есть стандарт и есть много готовых библиотек JSON JSON (JavaScript Object Notation – представление объектов JavaScript) – легкий формат представления данных, основанный на подмножестве синтаксиса JavaScript, а точнее на литералах массивов и объектов. JSON – это альтернатива традиционным форматам (обычный текст или XML), которые используются при обмене данными между сервером и клиентом. В отличие от XML и XML-совместимых языков, которые требуют синтаксического анализа, определения JSON могут быть просто включены в сценарии JavaScript. Формат JSON предложен программистом Дугласом Крокфордом (Douglas Crockford). JSON — простой иерархический формат, независимый от языка и платформы. JSON предлагается как альтернатива XML. Конечно, на все 100% заменить XML он не может, т.к. не поддерживает схем проверки, не может самостоятельно информировать о своей кодировке и не имеет понятия атрибутов, но легко его заменит там, где этими недостатками можно пренебречь. Также как и XML, JSON является самодокументирующимся форматом, описывающим структуру данных и не занимающихся их представлением. Главное преимущество JSON над XML — компактность. В рамках Web у него есть еще одно преимущество: он ведь представляет собой 100% валидный код JavaScript и его легко превратить из текста в данные JavaScript, а работать с полученными структурами проще и удобнее, чем с неповоротливым, хотя и универсальным, DOM (Document Object Model). Думаю, что последнее утверждение верно и для других языков программирования. Давайте для наглядности рассмотрим такой пример: набор структур, состоящих из id и ФИО. Так выглядит запись в XML: Код: (XML) <peoples> <record> <id>1</id> <surname>Иванов</surname> <firstname>Иван</firstname> <patronymic>Иванович</patronymic> </record> <record> <id>2</id> <surname>Петров</surname> <firstname>Петр</firstname> <patronymic>Петрович</patronymic> </record> </peoples> А так выглядит то же самое в JSON: Код: (Javascript) [ { id: 1, surname: "Иванов", firstname: "Иван", patronymic: "Иванович" }, { id: 2, surname: "Петров", firstname: "Петр", patronymic: "Петрович" } ]
Есть несколько основных правил для создания строки JSON:
Чтобы включить двойные кавычки в строку, нужно использовать обратную косую черту: \". Так же, как и во многих языках программирования, можно помещать управляющие символы и шестнадцатеричные коды в строку, предваряя их обратной косой чертой.
|