LINUX.ORG.RU

Библиотека yXML версия 1.1

 , , , ,


0

0

Вчера вышла улучшенная версия небольшой открытой библиотеки yXML для работы с простыми XML-данными. yXML открыт по модифицированной лицензией BSD (GPL-совместима) и его исходник составляет всего около 300 строк на C. Очень прост в использовании. По сравнению с версией 1.0 произошли следующие изменения:

  • Улучшенная совместимость со стандартным XML (поддерживаем <?..> и <!..>, но пропускаем)
  • Поддержка простых текстовых значений внутри тегов (<tag>test</tag>)
  • Добавлена возможность прочитать целиком сразу файл с xml
  • Добавлены функции для поиска тегов и атрибутов по имени

>>> Подробности



Проверено: maxcom ()

> Добавлены функции для поиска тегов и атрибутов по имени

XPath поддерживает или свой лисапед?

Begemoth ★★★★★
()

> версия 1.1 ... > Поддержка простых текстовых значений внутри тегов (<tag>test</tag>)

o_O По-моему с этого нужно было начинать, а не этим заканчивать.

Alan_Steel ★★
()
Ответ на: комментарий от Alan_Steel

> o_O По-моему с этого нужно было начинать, а не этим заканчивать.

А ну мне это было изначально не нужно. Поэтому реализовано только сейчас.

Вообще, чтобы минимизировать размер флейма, хочу отметить, что это узкоспециализированная библиотека, не поддерживающая целиком стандарт XML. Она нужна была под конкретные нужды. И хорошо, если пригодится ешё кому-то кроме меня :)

mrhx
() автор топика
Ответ на: комментарий от Deleted

>поддерживаем <?..> и <!..>, но пропускаем
>Кого пропускаем то?


Ну то есть, специальные теги <?..> и <!..> пропускаются, чтобы не выдавать ошибок. Однако их обработки нет.

То есть теперь можно записать чтото вроде:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ...>
<...>
</...>

И ошибки не будет как раньше =)

mrhx
() автор топика
Ответ на: комментарий от Alan_Steel

> Уж не для конфигов-ли? ;)

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

mrhx
() автор топика
Ответ на: комментарий от mrhx

По тексту как-то об этом не догадаешься…

Deleted
()
Ответ на: комментарий от mrhx

> Свой лисапед...

По каким причинам не был использован один из существующих парсеров? Скажем, сейчас трудно найти компьютер без libexpat.so

Manhunt ★★★★★
()

Цитата со страницы проекта:

> Нужен был небольшой сишный XML парсер. В Интернете я особо не искал по этому поводу, при этом было желание попрограммить — вот так и появился yXML за пару вечеров работы.


То есть yXML - плод невежества его автора. Автор, я правильно понимаю, что yXML в сравнении с нормальными полноценными парсерами имеет лишь недостатки?

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

> По каким причинам не был использован один из существующих парсеров?

Ну я долго в вопросе не разбирался, но то, что я видел было не удобно для использования. Мне нужно было так -- есть на входе файл с данными и надо его быстро прочитать в память. А я видел следующее: нужно было объявлять callback-и для чтения тегов и атрибутов, внутри них обрабатывать распарсенные имена. Как-то запарно очень. Наверняка надо было больше поискать, но было проще написать свой парсер за пару вечеров, зато меня он полностью устраивает :)

mrhx
() автор топика
Ответ на: комментарий от Manhunt

> Автор, я правильно понимаю, что yXML в сравнении с нормальными полноценными парсерами имеет лишь недостатки?

Какие недостатки?

mrhx
() автор топика
Ответ на: комментарий от mrhx

> Какие недостатки?

Не поддерживает стандарт XML. Плохо оттестирован. Не умеет эффективно работать с большими файлами.

Manhunt ★★★★★
()
Ответ на: комментарий от mrhx

> Какие недостатки?

Гораздо интереснее вопрос: какие преимущества? В чем заключается киллер-фича этой библиотеки, выгодно отличающая ее ото всех остальных подобных либ?

Если киллер-фича есть, то ее нужно упоминать в тексте новости и (большими жирными буквами) на главной странице проекта.

Если киллер-фичи нет, то лучше не замусоривать интернет ;)

Manhunt ★★★★★
()

Дежавю? Матрица перезагружается?

Gukl ★★★
()
Ответ на: комментарий от Manhunt

> Гораздо интереснее вопрос: какие преимущества?

Для меня преимущество в том, что она полностью соответствует моим нуждам. Ну это наверное преимущество любой софтины для её автора =)) Небольшой код позволяет легко разобраться в том как там всё устроено, если потребуется и модифицировать. Можно легко встроить в свою программу и её вес существенно не изменится.

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

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

mrhx
() автор топика

Автор молодец с нуля делают финальную стабильную продакшен версию.

А то другие годами идут до номера 0.9, а здесь сразу 1.1.

Также радует, что эта библиотека работает под процессорами AMD Turion 64 и Intel Atom N270 и в операционных системах MS Windows XP SP3 и ОС Ubuntu Linux 9.04.

sign
()
Ответ на: комментарий от mrhx

> Для меня преимущество в том, что она полностью соответствует моим нуждам. Ну это наверное преимущество любой софтины для её автора =))

Верно, но только для автора. Всему остальному миру это никаких бонусов не дает.

> Небольшой код позволяет легко разобраться в том как там всё устроено, если потребуется и модифицировать.


Хм. Если бы библиотека была хорошо оттестирована и соотвествовала стандарту, нужды в модификации не возникало бы. И разбираться в ее внутренностях тоже было бы не нужно. Ничего кроме ненужной головной боли я тут не вижу.

> Можно легко встроить в свою программу и её вес существенно не изменится.


Это же относится и к полноценным парсерам с динамической линковкой.

Manhunt ★★★★★
()

я конечно все понимаю, но нахрена для очередного хелло-ворда уже вторую новость пропускать?

А завтра добавится поддержка комментариев (читаем и не пропускаем) и снова будет новость на лоре?

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

AVL2 ★★★★★
()
Ответ на: комментарий от mrhx

>Ну то есть, специальные теги <?..> и <!..> пропускаются, чтобы не выдавать ошибок. Однако их обработки нет.

Бред какой, а?

Юноша, а кодировка у вас для XML берется из libastral.so?

stellar
()
Ответ на: комментарий от stellar

> Еще раз: yxml_t *xml = yxml_read("<data id='mydata'> test <detail index='1' /><detail index='2' /></data>", &p);
> ЭТО - НЕ XML


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

mrhx
() автор топика
Ответ на: комментарий от stellar

> Юноша, а кодировка у вас для XML берется из libastral.so?

А кодировки не поддерживаются :-[

Если хотите точных определений, то это подмножество XML, а не сам XML.

mrhx
() автор топика
Ответ на: комментарий от AVL2

> я конечно все понимаю, но нахрена для очередного хелло-ворда уже вторую новость пропускать?

Ну кому-нибудь наверняка пригодится, раз пригодилось мне.

mrhx
() автор топика

Автор, пробуйте внимательно следить за кодом. Собирайте проект с -Wall: посмотрите строки 251-253 и 276 в yxml.c:

long len;
FILE *f = fopen(filepath, "rb");
if (f)
{
...
}
if (plen) *plen = len;

Где инициализация len? Что будет, если fopen() вернет NULL?

andreyu ★★★★★
()
Ответ на: комментарий от Manhunt

> Где дано точное описание этого подмножества?

Действительно точного описания не написано.

mrhx
() автор топика

Последовательность <detail>simple&lt; &gt; text value</detail> парзится неверно.

Последовательность <трололо>ояебу</трололо> не парзится вовсе.

Последовательность <foo>1<bar>2</foo> парзится полностью, хотя не должна

Последовательность <xml><foo>1</foo></xml><xml></xml> парзится полностью, хотя не должна

Последовательность <foo>1<bar/> > </foo> парзится полностью, хотя не должна

Короче, аффтар! ПРОЧТИ ХОТЯ БЫ ОСНОВЫ прежде чем удивлять мир своими "трудами" http://ru.wikipedia.org/wiki/XML

stellar
()
Ответ на: комментарий от andreyu

> Где инициализация len? Что будет, если fopen() вернет NULL?

Ну неопределенное значение результата допустимо, если fopen вернет NULL, потому что вся функция вернёт NULL и результат *plen уже не будет иметь смысла. Хотя, так или иначе, да, тут моя ошибка, пропустил это.

mrhx
() автор топика
Ответ на: комментарий от mrhx

>А кодировки не поддерживаются :-[

Спецификация требует, чтобы процессоры XML __обязательно__ поддерживали Юникод-кодировки UTF-8 и UTF-16.

Я задал строку в UTF-8. Ничего не работает.

>Если хотите точных определений, то это подмножество XML, а не сам XML.

Подмножество? Не смешите.

stellar
()

Минорный релиз, не тянет на новость.

yoghurt ★★★★★
()
Ответ на: комментарий от mrhx

> Ну кому-нибудь наверняка пригодится, раз пригодилось мне.

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

Manhunt ★★★★★
()

Ой)) Ну спасибо)) Поржал)))

Люди! Ну вы чо охренели? Чувак же как лучше хотел! :-)

ei-grad ★★★★★
()

Автор, то что вы понаписали это не 300 строк кода. В таких исходниках копаться просто жутко. Немного полегчало после `indent -gnu` но там уже не 300, а более 350 строк получилось. Вы серьезно измеряете "понятность" программы количеством строк? Я конечно рад за вас и за то что вам доставляет удовольствие ваша работа, но до релиза вашей библиотеке еще очень далеко.

A-234 ★★★★★
()

Один символ '<' тоже, оказывается, нормальный "XML".

stellar
()

Пару слов.

1. Непонятно зачем хранится длина у имён тегов и аттрибутов, поскольку всё равно они хранятся как сишные строки с терминирующим '\0'. Дублирование информации, в случае ошибки, может приводить к странным эффектам. Если уж хочется хранить строки с длиной, то для этого можно отдельный тип завести. Могу подарить свою str.h :) http://li.nix.la/str.h (можно считать паблик домеин :) )

2. Чтобы не читать ужаса определения длины файла (три вложенных ифа), стоило бы сделать отдельную функцию.

3. Проверки на NULL лучше делать явно, чем if(f).

Casus ★★★★★
()
Ответ на: комментарий от Casus

> Непонятно зачем хранится длина у имён тегов и аттрибутов

Ускорение поиска тегов/атрибутов по имени. Просто сравнить сначала длину, а потом уже содержимое быстрее, чем искать сразу через сравнение по содержимому.

mrhx
() автор топика
Ответ на: комментарий от mrhx

> Просто сравнить сначала длину, а потом уже содержимое быстрее, чем искать сразу через сравнение по содержимому.

Почему длину, а не хэш-функции от строк?

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

> Почему длину, а не хэш-функции от строк?

Да, хэш лучше, но дольше -- его еще вычислять надо, а тут уже длина готовая есть. Как бы промежуточное решение.

mrhx
() автор топика
Ответ на: комментарий от bobrik

> в курсе вообще, что номер версии 1.0 значит? если реализован весь функционал, то почему бы и нет?

Ну вот я и радуюсь за автора, что весь функционал уже реализован.
Просто другие так программировать не умеют.
А автор за два вечера сделал сразу финальную версию с полным функционалом.

Кстати, если функционал окончательный, то видимо уже никогда не будут считывать тэги, содержащие минус.

Вот такой xml файл не "парсером" не распознается.

<?xml version="1.0" encoding="UTF-8"?>
<test-yxml/>

sign
()
Ответ на: комментарий от A-234

> но там уже не 300, а более 350 строк получилось

аналогично - пропустил через indent

393 1530 9405 yxml.c
54 280 1898 yxml.h
447 1810 11303 total

Итого 447 строк

sign
()
Ответ на: комментарий от Manhunt

> Где дано точное описание этого подмножества?

А как же yxml.c и yxml.h?
Вполне годится на точное описание формата

sign
()
Ответ на: комментарий от mrhx

>Ну я долго в вопросе не разбирался, но то, что я видел было не удобно для использования.
Можно было воспользоваться либо гуглом, либо командой apt-cache search xml (если в debian или производной), думаю управились бы быстрее чем за пару вечеров. Когда хочется создать свой велосипед, причем наплевать существуют ли уже подходящие решения или нет - это не профессионально. Думаю нижеприведенный код как пример API библиотеки вас бы устроил. Это из libxml.

xmlDocPtr doc;
xmlNodePtr cur;

doc = xmlParseFile(docname);

if (doc == NULL ) {
fprintf(stderr,"Document not parsed successfully. \n");
return;
}

cur = xmlDocGetRootElement(doc);

if (cur == NULL) {
fprintf(stderr,"empty document\n");
xmlFreeDoc(doc);
return;
}

if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
fprintf(stderr,"document of the wrong type, root node != story");
xmlFreeDoc(doc);
return;
}

eugene2k
()

>Поддержка простых текстовых значений внутри тегов (<tag>test</tag>)
>Добавлена возможность прочитать целиком сразу файл с xml

Ржунемагу! А че раньше не было? И этим можно было пользоваться??????

vada ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.