Искал легкий парсер XML, очень понравился Pug. Но он зараза не компилируется . Ошибки с i в цикле я еще могу исправить директивой, а остальные нет (там что-то с TCHAR, эта тема мимо меня прошла и я даже не знаю что это за "широкий" char).
Вопрос: кто смог использовать PugXML под VC9? Как?
Здравствуйте, Basil2, Вы писали:
B>Искал легкий парсер XML, очень понравился Pug. Но он зараза не компилируется . Ошибки с i в цикле я еще могу исправить директивой, а остальные нет (там что-то с TCHAR, эта тема мимо меня прошла и я даже не знаю что это за "широкий" char).
а чем же он Вам так понравился, если даже не собрался ?
на самом деле, там должно хватить вот такого
#include <tchar.h>
#include"pugxml.h"
TCHAR это либо char, либо wchar_t, в зависимости от макроса UNICODE
хотя код, на мой взгляд, довольно непрозрачен.
возможно, он очень быстрый, на первый взгляд, там есть некоторые оптимизации.
но разбираться там — мне бы не понравилось. к тому же, есть даже на первый взгляд моменты, типа
Здравствуйте, _Dreamer, Вы писали:
_D>а чем же он Вам так понравился, если даже не собрался ?
Интерфейсом.
_D>на самом деле, там должно хватить вот такого _D>
_D>#include <tchar.h>
_D>#include"pugxml.h"
_D>
Не хватит — компилятор видит TCHAR, но не может его сконвертить в char/string etc.
_D>TCHAR это либо char, либо wchar_t, в зависимости от макроса UNICODE
Спасибо.
_D>
_D>нехорошо это, по моему.
Нехорошо, хотя у меня ни разу в жизни malloc не проваливался и, дай бог, не провалится
Окей, если вы не любите Pug может тогда подскажите, как сделать чтобы TinyXml:
1. Для итератора по тегам (с определенным именем) шел вглубь иерархии, а не только но текущему уровню.
2. Для того же итератора шел то тегам без учета регистра
3. Доставал атрибуты без учета регистра.
(Пункты 1 и 2 в принципе можно реализовать руками, отказавшись от именованного итератора. А вот как реализовать 3, не лезя в код и не ища где там аналог strcmp, мне очень интересно).
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Здравствуйте, Basil2, Вы писали:
B>Не хватит — компилятор видит TCHAR, но не может его сконвертить в char/string etc.
попробовал, схватился за голову.
там используется тип TCHAR одновременно с std::string, вместо std::basic_string<TCHAR>.
если заменить std::string на std::basic_string<TCHAR>, то оно компилится. это же надо было так умудриться сделать...
B>Нехорошо, хотя у меня ни разу в жизни malloc не проваливался и, дай бог, не провалится
ну оно конечно, просто там может быть еще что-то, может быть и посерьезней.
B>Окей, если вы не любите Pug может тогда подскажите, как сделать чтобы TinyXml: B>1. Для итератора по тегам (с определенным именем) шел вглубь иерархии, а не только но текущему уровню. B>2. Для того же итератора шел то тегам без учета регистра B>3. Доставал атрибуты без учета регистра.
да нет, я его(Pug) впервые видел, ничего против не имею, по большому счету.
пункт первый — это по сути, descendant из XPath ( xpath 1.0 axis ).
с остальными — это библиотека должна поддерживать передачу компараторов, если в Pug это есть, а в TinyXML нет, так и карты в руки.
лично я давно сколотил себе велосипед, именно после работы с Tiny.
он умеет урезанный XPath, разные итераторы и допиливаю его при надобности.
Вам может, нужен просто более крутой парсер ? их вроде много, типа expat и прочего.
Здравствуйте, Basil2, Вы писали:
B>Окей, если вы не любите Pug может тогда подскажите, как сделать чтобы TinyXml: B>1. Для итератора по тегам (с определенным именем) шел вглубь иерархии, а не только но текущему уровню. B>2. Для того же итератора шел то тегам без учета регистра B>3. Доставал атрибуты без учета регистра.
Проход по элементам без учета регистра на TinyXML можно так реализовать, пишем две вспомогательные функции
TiXmlElement* XmlFindFirst(TiXmlElement *pElement, const char *name)
{
TiXmlElement *element = pElement->FirstChildElement();
for ( ; element; element = element->NextSiblingElement())
{
if (strcmpi(name, element->Value()) == 0)
return element;
}
return NULL;
}
TiXmlElement* XmlFindNext(TiXmlElement *pElement, const char *name)
{
TiXmlElement *element = pElement->NextSiblingElement();
for ( ; element; element = element->NextSiblingElement())
{
if (strcmpi(name, element->Value()) == 0)
return element;
}
return NULL;
}
и далее вместо стандартных FirstChildElement и NextSiblingElement исползуем их.
Здравствуйте, byleas, Вы писали:
B>По поводу "без учета регистра" — это разве входит в стандарт XML? Вопрос из интереса. Ну и зачем оно понадобилось.
Стандарт подозрительно молчит на этот счет — там почему-то вообще не сказано про регистр имен (я не нашел).
Но судя по тому, что при описании идентификаторов кодировок везде отдельно указывается "case insensitive way", то я предполагаю что имена должны быть как раз case sensitive.
Может, кто знает точнее?
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Здравствуйте, _Dreamer, Вы писали:
_D>там используется тип TCHAR одновременно с std::string, вместо std::basic_string<TCHAR>. _D>если заменить std::string на std::basic_string<TCHAR>, то оно компилится. это же надо было так умудриться сделать...
Спасибо, так действительно компиляется.
_D>Вам может, нужен просто более крутой парсер ? их вроде много, типа expat и прочего.
Точно не нужен, имеющийся бы освоить
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.