
TinyXML 2.6.2 с исправлениями для CVE-2021-42260 и CVE-2023-34194
/** @mainpage
TinyXML — это простой, небольшой парсер XML на C++, который можно легко интегрировать в другие программы.
Вкратце, TinyXML разбирает XML-документ и строит из него объектную модель документа (DOM), которую можно читать, изменять и сохранять.
XML расшифровывается как «eXtensible Markup Language» (расширяемый язык разметки). Он позволяет создавать собственные разметки документов. В то время как HTML отлично подходит для разметки документов для браузеров, XML позволяет определить любой вид разметки документов, например, документ, описывающий список «дел» для приложения-органайзера. XML — очень структурированный и удобный формат. Все те случайные форматы файлов, созданные для хранения данных приложений, могут быть заменены XML. Один парсер для всего.
Лучшее место для полной, корректной и, честно говоря, сложной для чтения спецификации находится по адресу http://www.w3.org/TR/2004/REC-xml-20040204/. Введение в XML (которое мне очень нравится) можно найти по адресу http://skew.org/xml/tutorial.
Существуют разные способы доступа и взаимодействия с XML-данными. TinyXML использует объектную модель документа (DOM), то есть XML-данные разбираются в объекты C++, которые можно просматривать и изменять, а затем записывать на диск или в другой выходной поток. Вы также можете создать XML-документ с нуля с помощью объектов C++ и записать его на диск или в другой выходной поток.
TinyXML спроектирован так, чтобы его было легко и быстро изучать. Он состоит из двух заголовочных файлов и четырёх файлов cpp. Просто добавьте их в свой проект — и готово. Есть пример файла — xmltest.cpp, чтобы вы могли начать.
TinyXML распространяется под лицензией ZLib, поэтому вы можете использовать его как в открытом, так и в коммерческом коде. Подробности лицензии находятся в начале каждого исходного файла.
TinyXML стремится быть гибким парсером, но с действительно корректным и соответствующим стандарту XML-выводом. TinyXML должен компилироваться на любой достаточно соответствующей стандарту C++ системе. Он не полагается на исключения или RTTI. Его можно скомпилировать с поддержкой STL или без неё. TinyXML полностью поддерживает кодировку UTF-8 и первые 64k символьных сущностей.
TinyXML не разбирает и не использует DTD (определения типов документов) или XSL (расширяемый язык таблиц стилей). Существуют другие парсеры (посмотрите на www.sourceforge.org, поищите XML), которые обладают гораздо более полными возможностями. Но они также гораздо больше, требуют больше времени на настройку в вашем проекте, имеют более крутую кривую обучения и часто имеют более ограничительную лицензию. Если вы работаете с браузерами или вам нужны более полные возможности XML, TinyXML — не ваш выбор.
Следующий синтаксис DTD не будет разобран в текущей версии TinyXML:
@verbatim ]> @endverbatim
потому что TinyXML видит это как узел !DOCTYPE с незаконно встроенным узлом !ELEMENT. Это может быть исправлено в будущем.
Для нетерпеливых — вот руководство, чтобы начать. Отличный способ начать, но стоит прочитать это (очень короткое) руководство полностью.
TinyXML — зрелый, проверенный код. Он очень стабилен. Если вы найдёте ошибки, пожалуйста, отправьте отчёт об ошибке на веб-сайте sourceforge (www.sourceforge.net/projects/tinyxml). Мы исправим их как можно скорее.
Есть некоторые области для улучшения; пожалуйста, проверьте sourceforge, если вы заинтересованы в работе над TinyXML.
Проекты TinyXML, которые могут вам пригодиться! (Описания предоставлены проектами.)
TinyXML может быть скомпилирован с использованием или без использования STL. При использовании STL TinyXML использует класс std::string и полностью поддерживает std::istream, std::ostream, operator<< и operator>>. Многие методы API имеют как формы 'const char*', так и 'const std::string&'.
Когда поддержка STL отключена, файлы STL вообще не включаются. Все строковые классы реализованы самим TinyXML. Методы API используют форму 'const char*' для ввода.
Используйте директиву времени компиляции #define:
TIXML_USE_STL
чтобы скомпилировать одну или другую версию. Это можно передать компилятору или установить в первой строке «tinyxml.h».
Примечание: При компиляции тестового кода в Linux установка переменной среды TINYXML_USE_STL=YES/NO будет управлять компиляцией STL. В файле проекта Windows предоставлены цели для STL и без STL. В вашем проекте, вероятно, проще всего добавить строку «#define TIXML_USE_STL» в качестве первой строки tinyxml.h.
TinyXML поддерживает UTF-8, что позволяет манипулировать XML-файлами на любом языке. TinyXML также поддерживает «устаревший режим» — кодировку, использовавшуюся до поддержки UTF-8 и вероятно лучше всего описываемую как «расширенный ASCII».
Обычно TinyXML пытается определить правильную кодировку и использовать её. Однако, установив значение TIXML_DEFAULT_ENCODING в заголовочном файле, TinyXML можно заставить всегда использовать одну кодировку.
TinyXML будет предполагать устаревший режим, пока не произойдет одно из следующего:
Что произойдёт, если кодировка установлена или определена неправильно? TinyXML попытается читать и пропускать текст, который выглядит неправильно закодированным. Вы можете получить странные результаты или искажённые символы. Возможно, вам потребуется принудительно установить для TinyXML правильный режим.
Вы можете принудительно переключить TinyXML в устаревший режим с помощью LoadFile( TIXML_ENCODING_LEGACY ) или LoadFile( filename, TIXML_ENCODING_LEGACY ). Вы можете принудительно заставить его использовать устаревший режим всё время, установив TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY. Аналогично, вы можете принудительно установить TIXML_ENCODING_UTF8 с помощью той же техники.
Для англоязычных пользователей, использующих английский XML, UTF-8 — это то же самое, что низкий ASCII. Вам не нужно знать о UTF-8 или как-либо менять свой код. Вы можете думать о UTF-8 как о «надмножестве» ASCII.
UTF-8 — это не двухбайтовый формат — это стандартная кодировка Unicode! TinyXML в настоящее время не использует и не поддерживает напрямую wchar, TCHAR или Microsoft _UNICODE. Часто можно встретить неправильное использование термина «Unicode» для обозначения UTF-16, широкобайтной кодировки юникода. Это источник путаницы.