» » » Д. Стефенс - C++. Сборник рецептов


Авторские права

Д. Стефенс - C++. Сборник рецептов

Здесь можно скачать бесплатно "Д. Стефенс - C++. Сборник рецептов" в формате fb2, epub, txt, doc, pdf. Жанр: Программирование, издательство КУДИЦ-ПРЕСС, год 2007. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Д. Стефенс - C++. Сборник рецептов
Рейтинг:
Название:
C++. Сборник рецептов
Автор:
Издательство:
КУДИЦ-ПРЕСС
Год:
2007
ISBN:
5-91136-030-6
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "C++. Сборник рецептов"

Описание и краткое содержание "C++. Сборник рецептов" читать бесплатно онлайн.



Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.






 }

 // Прочитать элемент даты рождения

 element = element->NextSiblingElement();

 if (element && strcmp(element->Value(), "dateOfBirth") == 0) {

  // Третьим дочерним элементом animal является дата рождения

  // (элемент "dateOfBirth"));

  // используйте его текстовое значение для установки даты

  // рождения в объекте result

  result.setDateOfBirth(textValue(element));

 } else {

  throw runtime_error("no dateOfBirth attribute");

 }

 // Прочитать элемент ветеринара

 element = element->NextSiblingElement();

 if (strcmp(element->Value(), "veterinarian") == 0) {

  // Четвертым дочерним элементом animal является ветеринар (элемент

  // "veterinarian"); используйте его для конструирования объекта

  // Contact и установки имени ветеринара в объекте result

  result.setVeterinarian(nodeToContact(element));

 } else {

  throw runtime_error("no veterinarian attribute");

 }

 // Прочитать элемент дрессировщика

 element = element->NextSiblingElement();

 if (strcmp(element->Value(), "trainer") == 0) {

  // Пятым элементом animal является дрессировщик (элемент "trainer");

  // используйте его для конструирования объекта

  // Contact и установки дрессировщика в объекте result

  result.setTrainer(nodeToContact(element));

 } else {

  throw runtime_error("no trainer attribute");

 }

 // Убедиться в отсутствии других дочерних элементов

 element = element->NextSiblingElement();

 if (element != 0) {

  throw runtime_error(

   string("unexpected element:") + element->Value()

  );

 }

 return result;

}


int main() {

 using namespace std;

 try {

  vector<Animal> animalList;

  // Обработать "animals.xml"

  TiXmlDocument doc("animals.xml");

  if (!doc.LoadFile())

   throw runtime_error("bad parse");

  // Убедиться, что корневым является список животных

  TiXmlElement* root = doc.RootElement();

  if (strcmp(root->Value(), "animalList") != 0) {

   throw runtime_error(string("bad root: ") + root->Value());

  }

  // Просмотреть все дочерние элементы корневого элемента, заполняя

  // список животных

  for (TiXmlElement* animal = root->FirstChildElement();

   animal; animal = animal->NextSiblingElement()) {

   animalList.push_back(nodeToAnimal(animal));

  }

  // Напечатать клички животных

  for (vector<Animal>::size_type i = 0, n = animalList.size(); i < n; ++i) {

   cout << animalList[i] << "\n";

  }

 } catch (const exception& e) {

  cout << e.what() << "\n";

  return EXIT_FAILURE;

 }

}

Обсуждение

TinyXml (буквально «крошечный XML») очень хорошо подходит в тех случаях, когда требуется выполнять несложную обработку документов XML. Дистрибутив исходных текстов этой библиотеки небольшой, ее легко построить и интегрировать в проекты, и она имеет очень простой интерфейс. Она также имеет очень либеральную лицензию. Главными ограничениями TinyXml являются невосприимчивость к пространствам имен XML, невозможность контроля DTD или схемы, а также невозможность анализа документов XML с внутренним DTD. Если вам требуется какая-то из этих функций или какая-нибудь XML-технология, как, например, XPath или XSLT, то необходимо воспользоваться другими библиотеками, рассмотренными в данной главе.

На выходе парсера TinyXml получается документ XML в виде дерева, узлы которого представляют элементы, текст, комментарии и другие компоненты документа XML. Корень дерева представляет собственно документ XML. Такое иерархическое представление документа называется объектной моделью документа (Document Object Model - DOM). Модель DOM, полученная парсером TinyXml, аналогична модели, разработанной консорциумом W3C (World Wide Web Consortium), хотя она и не полностью соответствует спецификации W3C. Вследствие приверженности библиотеки TinyXml принципам минимализма модель TinyXml DOM проще W3С DOM, однако она обладает меньшими возможностями.

Получить доступ к узлам дерева, представляющего документ XML, можно с помощью интерфейса TiXmlNode, который содержит методы, обеспечивающие доступ к родительскому узлу, последовательный доступ ко всем дочерним узлам, удаление и добавление дочерних узлов. Каждый узел является экземпляром некоторого производного типа; например, корень дерева является экземпляром TiXmlDocument, узлы элементов являются экземплярами TiXmlElement, а узлы, представляющие текст, являются экземплярами TiXmlText. Тип TiXmlNode можно определить с помощью его метода Туре(); зная тип узла, вы можете получить конкретное его представление с помощью таких методов, как toDocument(), toElement() и toText(). Эти производные типы содержат дополнительные методы, характерные для узлов конкретного типа.

Теперь несложно разобраться с примером 14.3. Во-первых, функция textValue() извлекает текстовое содержимое из элементов, содержащих только текст, например name, species или dateOfBirth. В этом случае данная функция сначала убеждается, что имеется только один дочерний элемент и что он является текстовым узлом. Она затем получает текст дочернего элемента, вызывая метод Value(), который возвращает текстовое содержимое текстового узла или узла комментария, имя тега узла элемента и имя файла корневого узла.

На следующем шаге функция nodeToContact() получает узел, соответствующий элементу veterinarian или trainer, и конструирует объект Contact из значений атрибутов name и phone, получаемых с помощью метода Attribute().

Аналогично функция nodeToAnimal() получает узел, соответствующий элементу животного element, и конструирует объект Animal. Это делается путем прохода по дочерним узлам с помощью метода NextSiblingElement(), извлекая при этом содержащиеся в каждом элементе данные и устанавливая соответствующее свойство объекта Animal. Данные извлекаются, используя функцию textValue() для элементов name, species и dateOfBirth и функцию nodeToContact() для элементов veterinarian и trainer.

В функции main я сначала конструирую объект TiXmlDocument соответствующий файлу animals.xml, и выполняю его синтаксический разбор с помощью метода LoadFile(). Затем я получаю элемент TiXmlElement, соответствующий корню документа, вызывая метод RootElement(). На следующем шаге я просматриваю все дочерние узлы корневого элемента, конструируя объект Animal из каждого элемента animal с помощью функции nodeToAnimal(). Наконец, я прохожу по всем объектам Animal, записывая их в стандартный вывод.

В примере 14.3 не проиллюстрирована одна функция библиотеки TinyXml, а именно метод SaveFile() класса TiXmlDocument, который записывает в файл документ, представляемый объектом TiXmlDocument. Это позволяет выполнить синтаксический разбор документа XML, модифицировать его, используя интерфейс DOM, и сохранить модифицированный документ. Документ TiXmlDocument можно создать даже с чистого листа и затем сохранить его на диске.

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

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

TiXmlDocument doc;

TiXmlElement root("hello");

doc.InsertEndChild(root);

doc.SaveFile("hello.xml");

Смотри также

Рецепты 14.3 и 14.4.

14.2. Работа со строками Xerces

Проблема

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

Решение

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

typedef std::basic_string<XMLCh> XercesString;

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

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


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

Похожие книги на "C++. Сборник рецептов"

Книги похожие на "C++. Сборник рецептов" читать онлайн или скачать бесплатно полные версии.


Понравилась книга? Оставьте Ваш комментарий, поделитесь впечатлениями или расскажите друзьям

Все книги автора Д. Стефенс

Д. Стефенс - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Отзывы о "Д. Стефенс - C++. Сборник рецептов"

Отзывы читателей о книге "C++. Сборник рецептов", комментарии и мнения людей о произведении.

А что Вы думаете о книге? Оставьте Ваш отзыв.