Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Объявление атрибута




<!ATTLIST элемент
атрибут 1 CDATA #REQUIRED

 

атрибут 2 CDATA #IMPLIED
>

Пример

<!ATTLIST pricelist
id CDATA #REQUIRED

 

name CDATA #IMPLIED
>

Элемент pricelist может содержать два атрибута – атрибут id и атрибут name. При этом атрибут id является обязательным, так как указано #REQUIRED, а атрибут name – не обязательным (указано #IMPLIED). В свою очередь CDATA указывает обработчику, что разбирать содержимое атрибутов не нужно.

Модификаторы (объясняют повторения элементов)

* — ноль или много.
? – ноль или один.
+ — один или много.

Пример

<!ELEMENT books (book+)>

Элемент 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:

  • Строка JSON содержит либо массив значений, либо объект (ассоциативный массив пар имя/значение).
  • Массив заключается в квадратные скобки ([ и ]) и содержит разделенный запятой список значений.
  • Объект заключается в фигурные скобки ({ и }) и содержит разделенный запятой список пар имя/значение.
  • Пара имя/значение состоит из имени поля, заключенного в двойные кавычки, за которым следует двоеточие (:) и значение поля.
  • Значение в массиве или объекте может быть:
    • Числом (целым или с плавающей точкой)
    • Строкой (в двойных кавычках)
    • Логическим значением (true или false)
    • Другим массивом (заключенным в квадратные скобки)
    • Другой объект (заключенный в фигурные скобки)
    • Значение null

Чтобы включить двойные кавычки в строку, нужно использовать обратную косую черту: \". Так же, как и во многих языках программирования, можно помещать управляющие символы и шестнадцатеричные коды в строку, предваряя их обратной косой чертой.


Поделиться:

Дата добавления: 2015-04-05; просмотров: 75; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты