powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / ApolloXML и особенности XSD
2 сообщений из 2, страница 1 из 1
ApolloXML и особенности XSD
    #38226536
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ApolloXML разрабатывается как самый быстрый парсер в мире.
За счёт того, что автомат знает, какой узел или атрибут ожидается на парсинг

Кроме того ApolloXML скорее всего самый удобный парсер в мире, как минимум среди SAX
Потому что все распарсенные узлы будут представлять собой структуру, где каждый атрибут - поле структуры

Я создаю эту ветку для:
1) напомнить, что работа над проектом, потихоньку ведётся. старую ветку закрыли
2) продолжить искать единомышленников
3) получить информацию по правилам XSD

Как я уже говорил, ранее, на мне самая сложная часть - генерация парсера
Оформить свою часть я решил в динамическую библиотеку "apollo_engine.dll"
Если найдётся энтузиаст, который сможет создать утилиту для пользователя (открывать XSD...), то он будет использовать "apollo_engine.dll" для непосредственной генерации. Причём язык утилиты не важен, Dll простая с соглашением cdecl (могу переделать на stdcall если надо).
Если такой энтузиаст не найдётся, то можно будет самому сгенерировать парсер, используя "apollo_engine.dll"
Мне например нужно будет парсить полуторагигабайтные XML, и функционала библиотеки "apollo_engine.dll" мне вполне хватит

Так вот.
На данный момент есть базовый хедер:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
const
  OPTION_NODE_NORMAL = 0;
  OPTION_NODE_IGNORE_ATTRIBUTES = 1;
  OPTION_NODE_IGNORE_CHILDS = 2;
  OPTION_NODE_IGNORE = 4 or OPTION_NODE_IGNORE_ATTRIBUTES or OPTION_NODE_IGNORE_CHILDS;

  // указывать в качестве max при добавлении узла
  APL_NODE_UNBOUNDED = 0;  
  
type
  // все идентификаторы в кодировке utf16
  apleng_string = type pwidechar;
  // целевой язык, в который будет сохранён парсер
  apleng_language = (alCpp, alCppAnsi, alDelphi, alDelphiAnsi);

  // API-типы
  ApolloProject = THandle; 
  ApolloNodeType = THandle;
  ApolloNode = THandle;
  ApolloAttributeType = THandle;
  ApolloAttribute = THandle;

// ------------------------------- ПРОЕКТ (парсер) -----------------------------------
// создаём проект
function  apleng_newproject(const language: apleng_language; const main: apleng_string;
                            const ignore_attr: boolean=false): ApolloProject; cdecl;
// сохраняем проект(парсер) в файл
procedure apleng_saveproject(const project: ApolloProject; const filename: apleng_string;
                             const apollo_unit: boolean=false); cdecl;
// удаляем проект
procedure apleng_freeproject(var project: ApolloProject); cdecl;


// ------------------------------------ ТИПЫ -----------------------------------------
// добавляем тип узла
function  apleng_nodetype(const project: ApolloProject; const name: apleng_string;
                          const min: integer=1; const max: integer=1;
                          const comment: apleng_string=nil): ApolloNodeType; cdecl;
// добавляем тип аттрибута
function  apleng_attrtype(const project: ApolloProject; const name: apleng_string;
                          const base_type: ApolloAttributeType;
                          const comment: apleng_string=nil): ApolloAttributeType; cdecl;

// ----------------------------- УЗЛЫ/АТТРИБУТЫ --------------------------------------
// добавляем узел
// в качестве parent принимаются ApolloProject, ApolloNodeType, ApolloNode
function  apleng_node(const parent: ApolloNode; const name: apleng_string;
                      const options: integer=OPTION_NODE_NORMAL; const min: integer=1; const max: integer=1;
                      const node_type: ApolloNodeType=0; const comment: apleng_string=nil): ApolloNode; cdecl; 

// добавляем аттрибут
// в качестве node принимаются ApolloProject, ApolloNodeType, ApolloNode
procedure apleng_attribute(const node: ApolloNode; const name: apleng_string; const attr_type: ApolloAttributeType;
                           const comment: apleng_string=nil; const def_value: apleng_string=nil); cdecl; 

//------------------------------------------------------------------------------------



Использовать нужно будет так:
- создаём "проект"
- иерархически добавляем туда узлы и атрибуты
- сохраняем парсер ("проект") в файл. получится *.pas или *.h/*.cpp
- удаляем "проект"

НО
XSD имеет кучу особенностей, с которыми я не знаком
Например в XSD как-то задать правила на "текст узла"
Поэтому я создаю ветку здесь, чтобы каждый желающий помочь мог здесь отписаться
Если существуют какие-то особенности XSD, которые не получится описать продемонстрированным API , или же существуют особенности XSD на которые стоит обратить повышенное внимание - милости прошу

Информационную помощь я разделяю на 3 категории по убыванию ценности:
1) выписать свой ответ в простой и полной форме, с примерами, личными комментариями. Иными словами такой информационный блок, после которого не нужно будет дополнительно искать информацию где-либо, не нужно будет проводить каких-либо тестов. К примеру если речь идёт о стандартных типах, то все стандартные типы должны быть перечислены, указан диапазон значений и/или pattern, область применения
2) ссылка на хорошую статью, желательно на русском
3) общая информация о чём-то


Я не резиновый, ресурсов у меня не много. Реализация "движка-генератора" парсеров - уже сложная задача, которую я беру на себя. Соответственно времени/сил на изучение XSD у меня по минимуму. Почти нет. Поэтому самый ценный для меня вариант помощи - это 1, или полноценный участник проекта, энтузиаст. Присоединяйтесь
...
Рейтинг: 0 / 0
ApolloXML и особенности XSD
    #38226547
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл комментарий по поводу хедера

разница между alCpp/alCppAnsi и alDelphi/alDelphiAnsi в кодировке
для alCpp и alDelphi файлы *.h,*.cpp,*.pas - могут сохраняться в кодировке utf8
для Ansi вариантов - файлы будут сохраняться в кодировке Ansi (текущая кодовая страница)

Это никак не отразится на парсинге, а влияет только на имена структур, полей, констант и комментариев


Код: pascal
1.
2.
procedure apleng_attribute(const node: ApolloNode; const name: apleng_string; const attr_type: ApolloAttributeType;
                           const comment: apleng_string=nil; const def_value: apleng_string=nil); cdecl; 


в случае если указан def_value - атрибут считается необязательным
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / ApolloXML и особенности XSD
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]