// Создать документ hello.xml, состоящий

// из единственного элемента "hello"

TiXmlDocument doc;

TiXmlElement root("hello");

doc.InsertEndChild(root);

doc.SaveFile("hello.xml");

Смотри также

Рецепты 14.3 и 14.4.

<p>14.2. Работа со строками Xerces</p>Проблема

Требуется обеспечить надежную и простую работу со строками с расширенным набором символов, используемыми библиотекой Xerces. В частности, необходимо уметь сохранять строки, возвращаемые функциями библиотеки Xerces, а также выполнять преобразования между строками Xerces и строками стандартной библиотеки С++.

Решение

Сохранять строки с расширенным набором символов, возвращаемые функциями библиотеки Xerces, можно с помощью шаблона std::basic_string, специализированного типом с расширенным набором символов XMLCh библиотеки Xerces.

typedef std::basic_string XercesString;

Для выполнения преобразований между строками Xerces и строками, состоящими из стандартных символов, используйте перегруженный статический метод transcode() из класса xercesc::XMLString, который определен в заголовочном файле xercesc/util/XMLString.hpp.

В примере 14.4 определяются две перегруженные вспомогательные функции, toNative и fromNative, которые используют transcode для преобразования строк со стандартными символами в строки Xerces и обратно. Каждая функция имеет две версии: одна принимает строку в C-стиле, а другая принимает строку стандартной библиотеки С++. Для выполнения преобразований между строками Xerces и строками со стандартными символами вполне достаточно иметь эти служебные функции; после того как вы определили эти функции, вам уже никогда не потребуется вызывать непосредственно transcode.

Пример 14.4. Заголовочный файл xerces_strings.hpp, используемый для выполнения преобразований между строками Xerces и строками со стандартными символами

#ifndef XERCES_STRINGS_HPP_INCLUDED

#define XERCES_STRINGS_HPP_INCLUDED

#include

#include

#include

typedef std::basic_string XercesString;

// Преобразует строку со стандартными символами

// в строку с расширенным набором символов

inline XercesString fromNative(const char* str) {

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

 return XercesString(ptr.get());

}

// Преобразует строку со стандартными символами

// в строку с расширенным набором символов.

inline XercesString fromNative(const std::string& str) {

 return fromNative(str.c_str());

}

// Преобразует строку с расширенным набором символов

// в строку со стандартными символами.

inline std::string toNative(const XMLCh* str) {

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

 return std::string(ptr.get());

}

// Преобразует строку с расширенным набором символов в строку со стандартными символами.

inline std::string toNative(const XercesString& str) {

 return toNative(str.c_str());

}

#endif // #ifndef XERCES_STRINGS_HPP_INCLUDED

Для выполнения преобразований между строками Xerces и std::wstring просто используйте конструктор std::basic_string, передавая ему два итератора. Например, можно определить следующие две функции.

// Преобразует строку Xerces в строку std::wstring

std::wstring xercesToWstring(const XercesString& str) {

 return std::wstring(str.begin(), str.end());

}

// Преобразует строку std::wstring в строку XercesString

XercesString wstringToXerces(const std::wstring& str) {

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

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