Tinyxml как раньше называли
Перейти к содержимому

Tinyxml как раньше называли

  • автор:

XML Parser for MS Visual C++ — using problem (3 стр)

Честно говоря TinyXML не видел, да и сидя под мелкософтом кажется лишним смотреть в сторону каких-либо сторонних библиотечек, сам недавно сделал классики-оболочки над микрософтовским DOM, в целом структура проги остаётся как и с микрософтовской либой, но некоторые моменты сделаны несколько удобней, в частности в коде проги не надо конвертить из комвариантов и обратно и вполне доволен. А вот от c_str() пока не избавился, некогда было :).

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

Пинать не сильно, плиз 🙂

#31
22:29, 6 мар 2007

Полноте, разве я против M$? 🙂 Вовсе даже нет. Но все прилично поддерживаемые инструменты денег стоят, как правило, и часто — очень хороших. мой вопрос про качество опенсорсного примера был скорее риторическим (да и просто я устал заставлять его работать). конструктив состоял в просьбе помочь мне с парсингом ХМЛ за разумное вознаграждение)

#32
23:05, 6 мар 2007

Абстрактный вопрос, вы можете привести реальный пример из геймдева на парсинг xml, где обязательно нужен DOM и не годится SAX? Надо для того, чтобы подтвердить/опровергнуть умозрительный тезис о том, что DOM в ГД особо не нужен.

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

#33
0:04, 7 мар 2007

Очень рекомендую посмотреть принцип парсера в CEGUI. Он основан на tinyXML и ОЧЕНЬ удобен. Всего 3 класса обладают нужной функциональностью, а для конкретных файлов/тегов пишется унаследованный класс-специализация.

#34
5:17, 7 мар 2007

Хочу сказать, что viv и Zeux правы. TinyXML один из самых плохих из доступных парсеров (правда, зависит от критериев).

Они правда не предложили ни одного парсера получше, но найти их в гугле не должно составить труда.

Я традиционно сам пишу себе парсеры ).

Godless
>содержит античные вызовы со всякими FILE*, const char*
>Неужто нельзя было придумать элегантный, безопасный, современный пример?
На самом деле, это и есть самый элегантный, безопасный и всегда современный пример. Хотя лучше конечно не завязываться на stdio.

Повторюсь, что если речь идёт о применении в геймдеве, то лучше сразу начинать юзать нормальные парсеры.

#35
5:21, 7 мар 2007

Конишуа
Смотря какие задачи. Теоретически, что угодно можно распарсить и домом, и саксом ). Практически, SAX становится SUXX тогда, когда в данных есть много cross-links. Например, Collada.

Если для тебя наиболее частые задачи — парсинг конфига (кстати, нахрена конфигу быть в XML? это так сейчас модно, да?), то возможно DOM никогда и не нужен.

Подключение TinyXml (3 стр)

так, хватит что-то умное обсуждать. лучше расскажите, как тем же tinyxml прочитать юникодную строку.

printf( "%s", settingsFile.FirstChildElement( "node")->Attribute( "name"));

если язык системы стоит не русский, выводит кракозябры.

#31
19:42, 16 апр 2014

Suslik
> выводит
this.

printf не может в кириллицу (без доп. установок локали).

#32
19:46, 16 апр 2014

кто виноват? что делать? отладчик внутри TiXmlElement тоже показывает мусор, а не юникод, то есть проблема где-то наньше printf, судя по всему.

#33
20:05, 16 апр 2014

Попробуй так сделать в начале main:

SetConsoleCP( 1251); SetConsoleOutputCP( 1251); setlocale( LC_CTYPE,"Russian");

#34
20:05, 16 апр 2014

Suslik
> отладчик внутри TiXmlElement тоже показывает мусор, а не юникод
Мне чисто интересно, а

std::string = ""// any string in unicode

Не белиберду в отладчике показывает?
И может, даже выводит printf нормально?

Я на что намекаю — может не в tinyXml дело то? 😉

#35
20:09, 16 апр 2014

короче, как я понял, там не только у tinyxml проблемы с чтением юникода(везде работает с char*), но и у std::string вообще. нужно переходить на std::wstring, париться с консолью, переходить на tinyxml2(обёрнут вокруг wstring) или.. или просто врубить русскую локаль, что я и сделал :3

#36
23:20, 16 апр 2014

Suslik
> если язык системы стоит не русский, выводит кракозябры.

подключаешь pugixml в режиме Unicode и он все прочитает. Под режимом я подразумевал что программа в Unicode или же специально для pugi включаешь #define UNICODE.

#37
4:08, 17 апр 2014
#38
11:26, 17 апр 2014

tinyxml2 намного лучше tinyxml, по крайней мере читает в разы быстрее. Но pugixml лучше всех.

  • >:+()___ [Smile]
  • Постоялец

#39
12:38, 17 апр 2014

Suslik
> короче, как я понял, там не только у tinyxml проблемы с чтением юникода(везде работает с char*), но и у std::string вообще.
Это не у них проблемы, это проблемы у M$, которые за 15 лет не могут сделать нормальную поддержку юникода в своих Окнах.
Во всех нормальных системах, что char*, что std::string всегда содержат строки в кодировке UTF-8 и никаких проблем с юникодом не имеют.
Стандартная библиотека от Micro$oft с юникодом работать не умеет и, если в случае printf можно выводить wchar_t*, то другие функции вообще не поддерживают юникод ни в каком виде (например, fopen не умеет открывать файлы с произвольными именами).

P. S. Насколько я помню, tinyxml всегда умела работать с UTF-8, поэтому проблемы должны быть только с выводом на экран, а не с самим получением атрибута. Отладчик, вроде, тоже можно заставить показывать строки с кодировкой UTF-8.

#40
16:55, 17 апр 2014

>:+()___ [Smile]
> Насколько я помню, tinyxml всегда умела работать с UTF-8,
У меня она сыпалась при попытке прочесть кириллицу в *dae выхлопе 3dsmax collada exporter-а
Почему — не знаю, но с пуги проблем не было.

#41
17:00, 17 апр 2014

>:+()___ [Smile]
> не могут сделать нормальную поддержку юникода в своих Окнах.
в своих студиях же. у WinAPI то вроде нет проблем с ним, и у нормальных языков под виндой тоже.

  • >:+()___ [Smile]
  • Постоялец

#42
17:22, 17 апр 2014

kipar
> в своих студиях же. у WinAPI то вроде нет проблем с ним, и у нормальных языков под виндой тоже.
Я бы не назвал это «нет проблем», что и подтверждают вечные проблемы с «русскими буквами» и «кракозябрами» под виндой.
«Нормальные» языки просто все что можно оборачивают, и то, иногда бывают проблемы.

Нормальной поддержкой было бы

_setmbcp(CP_UTF8);

но поддерживаемые кодировки могут быть:

Any other valid code page value, regardless of whether the value is an ANSI, OEM, or other operating-system-supported code page (except UTF-7 and UTF-8, which are not supported).

#43
20:45, 17 апр 2014

>:+()___ [Smile]
> например, fopen не умеет открывать файлы с произвольными именами
_wfopen ?

  • danielskachkov
  • Постоялец

#44
22:47, 17 апр 2014

Дабы не создавать еще одну тему с очередным наверняка глупым вопросом (ответ на который, однако ж, мне найти не удалось, хотя и старался) спрошу здесь. Скажите, как мне представить часть пути к ноду переменной? Что-то вроде
doc.select_single_node(«/start/» + variable + «/end»);
И подойдет ли для этих целей string variable?

Очень краткая история языков разметки, или что было до XML

Для кого я писал этот пост про XML? Для тех, кто много и хорошо пишет — статьи, книги, техническую документацию. Не так важно, что пишет, как то, сколько времени на это тратит. Этот текст для тех, кто старается экономить свое время и ищет для этого новые эффективные методы. А XML при умелом обращении на 75% сокращает время и деньги на создание документов.

За границей ружья кирпичом не чистят © Левша

Занимаясь долгое время разработкой XML приложений, я как-то привык не замечать, что этот язык практически полностью обойден вниманием в рунете. Нет, конечно, многие знают про Atom, XML-RPC и SOAP, но сейчас речь совсем не об этом. Создание документов — вот какой аспект XML до сих пор незаслуженно остается в тени.

Достаточно взглянуть на статистику поисковых запросов:

Запросов в Google/Яндекс «XML editor»/«XML редактор» «XML»
в англоязычном интернете 2’740’000 90’000
в Рунете 93’000 чуть более 2’000

Прямо скажем — факты не в пользу 1/6 части суши. Мне кажется, что одной из причин этого является привычка откладывать на завтра то, что можно сделать сегодня, и нежелание инвестировать свои силы и время в перспективные решения своих проблем.

Тот, кто хочет — ищет способ, кто не хочет — ищет причину.

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

Усложнять — просто, упрощать — сложно (инженерная мудрость)

С давних пор пишущая братия мается проблемами написания текстов и распространения написанного. Если взглянуть внимательнее, то основная маета происходит из-за оформления текстов. Во времена глиняных табличек это было неизбежным злом. Но вот с появлением машинной обработки текстов стало возможным отделить наконец семантику (смысл) документов от их оформления. И, надо сказать, определенные успехи в этом сделаны. Так зачем цепляться за клинопись, когда можно попробовать воспользоваться изобретенными удобствами в личных корыстных целях?

GML — первый шаг к упрощению

GML (англ. Generalized Markup Language — обобщенный язык разметки) был разработан в 1969 году в компании IBM как набор макросов для текстового процессора SCRIPT/VS. Язык GML был разработан Чарльзом Гольдфарбом (Charles Goldfarb), Эдвардом Мошером (Edward Mosher) и Рэймондом Лори (Raymond Lorie), чьи инициалы и были использованы в названии языка.

GML освободил писателей от необходимости напрямую использовать возможности процессора SCRIPT/VS, касающиеся размера шрифта, межстрочных интервалов, размеров страниц и т.д. Синтаксическая разметка (или теги) языка GML описывала текст документа в терминах глав, разделов разной степени важности, параграфов, списков, таблиц и прочего.

Размеченный документ можно было затем автоматически отформатировать для разных устройств вывода информации — лазерных и матричных принтеров или мониторов — просто задав документу профайл нужного устройства. Сам же документ при этом оставался неизменным.

Пример документа с разметкой GML

:h1.Глава 1: Вступление
:p.GML поддерживает иерархические структуры, такие как
:ol
:li.Нумерованные списки, такие, как этот,
:li.Маркированные списки и
:li.Списки определений,
:eol.
а также просто текст.
:p.Упрощенная разметка (обобщенная и формализованная позднее в языке SGML)
позволяет не вставлять закрывающие теги для элементов «h1» (заголовок) и «p» (параграф).

GML предшествовал и послужил одним из источников появления языка SGML — набора правил для создания языков описания структурированных документов.

SGML — колосс на глиняных ногах

В 1986 году появился SGML (англ. Standard Generalized Markup Language — стандартный обобщённый язык разметки) — метаязык, с помощью которого можно было создавать конкретные языки разметки документов. Изначально SGML был разработан для использования машинно-читаемых документов в правительственных и аэрокосмических проектах. Он и сейчас там используется, хотя прошло уже более 30 лет — огромный срок по меркам ИТ.

Пример разметки SGML документа:

Язык SGML предоставляет абстрактный синтаксис, который можно применять в конкретных сценариях. Например, можно использовать любой символ как разделитель тегов, вместо стандартных угловых скобок. Это было сделано, в частности, для совместимости с GML документами — то, что в GML выглядит как :xmp.Hello, world:exmp , в стандартном синтаксисе SGML выглядит как Hello, world

SGML позволял изменять до неузнаваемости практически все аспекты семантической разметки текста. Для упрощения набора документов в и без того сложном стандарте сделали хитроумные правила, по которым некоторые элементы разметки писатель мог пропустить без потери целостности документа. Такая невероятная гибкость языка серьезно усложнила жизнь разработчиков софта для его поддержки и в конечном счете затруднила его широкое распространение для повседневного использования.

Сложность и, как следствие, дороговизна SGML ограничивают его использование только крупными компаниями, которые могут потратиться на необходимое программное обеспечение и квалифицированных специалистов.

HTML — у семи нянек дитя без глазу

Хотя, не все так плохо, если говорить о применениях SGML как метаязыка. Ведь именно он послужил в 1992 году родителем языка HTML, который формально является приложением SGML (формально он сделался таковым только в версии 2.0). HTML даже унаследовал от SGML его синтаксис по умолчанию — угловые скобки, нечувствительность к регистру в именах элементов и расслабленность синтаксиса тегов.

Ключевая особенность HTML — его расслабленность — сыграла злую шутку с языком и его пользователями. Простота HTML позволила ему быстро распространиться по всему интернету, а потом, как ни дико это звучит, стала основным недостатком и тормозящим фактором в его развитии. Отсутствие расширяемости (фиксированный набор элементов) и четкой структуры документов привели к необходимости вновь вернуться к поискам философского камня для писателей.

Ограниченность количества тегов и полное безразличие к структуре документа побудили разработчиков в лице консорциума W3C к созданию такого языка разметки, который был бы не столь сложен, как SGML, и не настолько примитивен, как HTML. В результате, сочетая в себе простоту HTML, логику разметки SGML и удовлетворяя требованиям Интернета, появился на свет язык XML.

XML — назад в будущее!

XML (англ. eXtensible Markup Language — расширяемый язык разметки) был создан в феврале 1998 года как подмножество SGML. Расширяемым он называется потому, что позволяет своим пользователям изобретать элементы по необходимости.

XML был разработан рабочей группой из 11 человек при поддержке около 150 заинтересованных разработчиков. Члены рабочей группы никогда не встречались лицом к лицу — все технические дискуссии происходили в почтовой переписке, а вопросы решались поиском компромисса и, в сложных случаях, голосованием рабочей группы. Основные технические решения были найдены в течение 20 недель интенсивной работы с июля по ноябрь 1996 года, когда был опубликован рабочий черновик спецификации XML. В дальнейшем работа была продолжена, и 10 февраля 1998 года XML обрел статус рекомендованного стандарта.

Простота XML (по сравнению с SGML) позволила создавать гораздо более простые парсеры (программы синтаксического разбора документов). Как следствие, XML гораздо шире распространен, чем SGML, хотя появился на 12 лет позднее.

Кроме того, XML проще поддается интернационализации — XML напрямую поддерживает Юникод практически во всем его великолепии — в именах элементов, атрибутов, комментариях, текстовом контенте. Приведенный ниже пример показывает это нагляднее всех слов:

Применение XML не ограничивается документами в обычном смысле этого слова — он используется в ряде приложений общего назначения, таких как Semantic Web, XHTML, SVG, RSS, Atom, XML-RPC и SOAP.

Ну вот и все

С момента создания XML прошло 11 лет его успешного применения в различных сферах человеческой деятельности, и это хороший показатель качества языка. За это время он породил множество сопутствующих форматов, также XML-ных: XML Schema, XSLT, XSL-FO, XPath, XInclude, XML Catalogs, XQuery, Docbook (не путать с SGML Docbook), DITA (не ищите по такому названию, чтобы не удивляться результатам поиска, лучше — «DITA XML»). И это — только те стандарты, которые непосредственно интересны при написании документов.

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

_________
Текст подготовлен в ХабраРедакторе

Tinyxml как раньше называли

Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.11.2007

Репутация: нет
Всего: нет

Добрый день. Никак не могу найти документацию по использованию TinyXML на русском. Парсер простой, но разбираться в нем самому время не позволяет. Возможно кто-нибудь даже от себя мог бы написать основное по загрузке хмл, удалению/добавлению объектов и т.д. Заранее благодарен.

Дата 30.11.2007, 15:49 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196

Код
TiXmlDocument xml(«/path/to/file.xml»);
if (xml.LoadFile()) TiXmlElement* root = document.FirstChildElement( «root» );
if (!root)
throw «No root element»;

Если и это не помогло, то берем словарь (англо-русский) и переводим названия классов и методов: http://www.grinninglizard.com/tinyxmldocs/hierarchy.html

Дата 30.11.2007, 16:39 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154

Там прямо в архиве с библиотекой есть нормальный tutorial, даже не зная английский можно по примерам разобраться

Дата 1.12.2007, 16:59 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.11.2007

Репутация: нет
Всего: нет

bsa
Cпасибо, что не пожалели время, очень помогли. Если будут появляться вопросы, надеюсь поможете еще

Дата 3.12.2007, 20:49 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.11.2007

Репутация: нет
Всего: нет

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

Дата 3.12.2007, 22:11 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196

Tiny, я же написал рабочий пример — надо только в main() запихнуть.

Дата 3.12.2007, 22:15 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.11.2007

Репутация: нет
Всего: нет

Извините, что зря потревожил, просто я подключал в проект только 1 tinyxml.h, а надо было все 6 файлов tiny.

Дата 3.12.2007, 22:27 (ссылка) | (голосов:1) Загрузка .

Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196

Код
#include
#include «tinyxml.h»
int main()
TiXmlDocument doc(«test.xml»);
if (!doc.LoadFile())
return 1;
TiXmlElement *root = doc.FirstChildElement(«root»);
if (!root)
return 2;
for(const TiXmlElement *elem = root->FirstChildElement(«elem»); elem; elem = elem->NextSiblingElement(«elem»)) std::cout Attribute(«name») >
return 0;
>

Добавлено через 51 секунду
компилировать надо так:
g++ -DTIXML_USE_STL -o test test.cpp tinyxml.cpp tinyxmlparser.cpp tinyxmlerror.cpp

Дата 3.12.2007, 23:39 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.11.2007

Репутация: нет
Всего: нет

bsa «У Вас недостаточно постов, чтобы изменять репутацию пользователей. Необходимо 100 постов.»
Надо еще поспрашивать А если файл большой, элементы в ручную перебирать приходится все равно? И как можно вместо «elem5» поставить «element» и вывести в хмл?

Дата 4.12.2007, 00:30 (ссылка) | (голосов:1) Загрузка .

Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196

Что значит «большой файл» и «перебирать вручную»?
Я, например, все делаю через классы. Например, у меня есть класс Project, который внутри еще содержит ряд классов. Например, пару списков, таблицы, настройки и пр. Каждому классу делается метод loadXML(TiXmlElement*elem), который осуществляет загрузку данных конкретного класса. Таким образом, что метод loadXML(), например, класса Project вызывает методы loadXML() для всех подклассов загружая их.

Как вместо xxx подстваить yyy:

Код
//функция находит элемент на текущем уровне иерархии, атрибут attr которого равен value
TiXmlElement* findElementWithAttribute(TiXmlElement *elem, const std::string& attr, const std::string &value)
const std::string &elem_name = elem->ValueStr();
do const char *cname = elem->Attribute(attr);
if (cname && cname == value)
break;
elem = elem->NextSiblingElement(elem_name);
>while(elem);
return elem;
>

Дата 4.12.2007, 00:43 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.11.2007

Репутация: нет
Всего: нет

Я имел в виду, что для чтения хмл в этом случае нужно писать вручную названия всех нодов, элементов, параметров. А если брать большой файл, со сложной структурой нодов? Нет способа вывести списки элемент-значение без знания названия элементов? Я просто слышал что есть специальный язык преобразования хмл в дерево объектов с параметрами, и некоторые парсеры вроде позволяют это делать. Может я многого недопонимаю в этом деле правда.

Дата 4.12.2007, 11:50 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196

Tiny, у TinyXml есть методы TiXmlNode::FirstChildElement() и TiXmlNode::NextSiblingElement() в которых не указываются названия элементов, а так же TiXmlElement::FirstAttribute(), TiXmlElement::LastAttribute(), TiXmlAttribute::Previous() и TiXmlAttribute::Next(), которые позволяют узнать все атрибуты элементов. TinyXml позволяет распарсить xml документ. Смотри внимательно документацию, там и без перевода все более или менее понятно. Если что непонятно, переводи слова из названий методов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *