Читаем C++. Сборник рецептов полностью

 return XercesString(str.begin(), str.end());

}

В этих функциях используется тот факт, что wchar_t и XMLCh являются интегральными типами, каждый из которых может неявно преобразовываться в другой; это должно работать независимо от размера wchar_t, пока не используются значения, выходящие за диапазон XMLCh. Вы можете определить подобные функции, принимающие в качестве аргументов строки в C-стиле, используя конструктор std::basic::string, которому передаются в качестве аргументов массив символов и длина.

Обсуждение

Для представления строк в коде Unicode библиотека Xerces использует последовательности символов XMLCh, завершаемые нулем. Тип XMLCh вводится с помощью typedef как интегральный тип, зависящий от реализации и содержащий не менее 16 бит, которых достаточно для представления символов почти любого языка. Xerces применяет символьную кодировку UTF-16, что подразумевает теоретическую возможность представления некоторых символов в коде Unicode в виде последовательности из нескольких символов XMLCh; однако практически можно считать, что каждый символ XMLCh непосредственно представляет один символ в коде Unicode, т.е. имеет числовое значение символа Unicode.

Одно время тип XMLCh определялся с помощью typedef как wchar_t, что позволяло легко сохранять копию строки Xerces как std::wstring. Однако в настоящее время Xerces определяет XMLCh на всех платформах с помощью typedef как unsigned short. Кроме всего прочего это означает, что на некоторых платформах типы XMLCh и wchar_t имеют разный размер. Поскольку Xerces может изменить в будущем определение XMLCh, нельзя рассчитывать на то, что XMLCh будет идентичен какому-то конкретному типу. Поэтому, если требуется сохранить копию строки Xerces, следует использовать тип std::basic_string.

При использовании Xerces вам придется часто выполнять преобразования между строками со стандартными символами и строками Xerces; для этой цели в Xerces предусмотрена перегруженная функция transcode(). transcode() может преобразовать строку Unicode в строку со стандартными символами, использующую «родную» кодировку символов, или строку с «родной» кодировкой со стандартными символами в строку Unicode. Однако смысл родной кодировки точно не определен, поэтому если вы программируете в среде, в которой часто используется несколько кодировок символов, то вам придется все взять в свои руки и выполнять преобразования особым образом, используя либо фасет std::codecvt, либо подключаемые службы перекодировки (pluggable transcoding services) библиотеки Xerces, описанные в документации Xerces. Однако во многих случаях вполне достаточно использовать transcode().

Память под возвращаемые функцией transcode() строки, завершающиеся нулем, динамически выделяется при помощи оператора new в форме массива; вам придется строку удалять самому, используя оператор delete[]. Это создает небольшую проблему управления памяти, поскольку обычно требуется копировать строку или записывать ее в поток до ее удаления, а эти операции могут выбросить исключение. Я решаю эту проблему в примере 14.4 с помощью шаблона boost::scoped_array, который динамически выделяет память под массив и автоматически удаляет его при выходе из области видимости, даже если выбрасывается исключение. Например, рассмотрим реализацию функции fromNative.

inline XercesString fromNative(const char* str) {

 boost::scoped_array ptr(xercesc::XMLString::transcode(str));

 return XercesString(ptr.get());

}

Здесь ptr становится обладателем возвращенной функцией transcode() строки с нулевым завершающим символом и освобождает ее, даже если конструктор XercesString выбрасывает исключение std::bad_alloc.

14.3. Синтаксический анализ сложного документа XML

Проблема

Имеется некоторый набор данных, хранимых в документе XML, внутри которого используется DTD или применяются пространства имен XML. Требуется выполнить синтаксический анализ документа и превратить содержащиеся в нем данные в набор объектов C++.

Решение

Перейти на страницу:

Похожие книги

1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных
C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных