Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

How to Populate a Property Tree

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 28. Boost.PropertyTree

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

ФорматXMLявляется отраслевым стандартом для хранения информации в текстовой форме. К сожалению, на момент написания этой статьи нет XML-парсераBoost. Библиотека содержит быстрый и крошечныйRapidXML.парсер (в настоящее время в версии 1.13) для обеспечения поддержки анализа XML. RapidXML не полностью поддерживает стандарт XML; он не способен анализировать DTD и, следовательно, не может выполнять полную замену сущности.

По умолчанию парсер сохраняет большую часть белого пространства, но удаляет содержимое элементов, которое состоит только из белого пространства. Закодированные белые пространства (например, ) не считаются белым пространством в этом отношении. Вы можете передать флаг trim_whitespace, если хотите, чтобы все ведущее и заднее белое пространство было обрезано, а все непрерывное белое пространство рухнуло в одно пространство.

Обратите внимание, что RapidXML не понимает спецификации кодирования. Если вы передадите ему буфер символов, он предполагает, что данные уже правильно закодированы; если вы передадите ему имя файла, он прочитает файл, используя преобразование символов в предоставленной вами области (или в глобальной области, если вы не предоставите ее). Это означает, что для того, чтобы разобрать XML-файл с кодировкой UTF-8 в wptree, вы должны предоставить альтернативную локализацию, либо напрямую, либо путем замены глобальной.

XML / схема преобразования дерева свойств<read_xml>и<write_xml>:

  • Каждый элемент XML соответствует узлу дерева свойств. Детские элементы соответствуют детям узла.
  • Атрибуты элемента XML хранятся в подключе<<xmlattr>>. Есть один детский узел на атрибут в атрибутном узле. Существование узла<<xmlattr>>не гарантируется или не требуется, когда нет атрибутов.
  • XML-комментарии хранятся в узлах по имени<<xmlcomment>>, если игнорирование комментариев не включено через флаги.
  • Текстовое содержимое хранится одним из двух способов, в зависимости от флагов. Способ по умолчанию объединяет все текстовые узлы и хранит их в качестве данных узла элемента. Таким образом, весь контент можно удобно читать, но относительная упорядоченность текста и детских элементов теряется. Другой способ хранит каждый текстовый контент в виде отдельного узла, называемого<<xmltext>>.

Кодирование XML-хранилища не идеально подходит для обхода. Цикл чтения-записи теряет урезанное белое пространство, низкоуровневую информацию форматирования и различие между обычными данными и узлами CDATA. Комментарии сохраняются только при включении. Цикл чтения теряет обрезанное белое пространство; то есть, если дерево происхождения имеет данные строк, которые начинаются или заканчиваются белым пространством, то белое пространство теряется.

ФорматJSONпредставляет собой формат обмена данными, полученный из объектной буквальной записи JavaScript. (JSON расшифровывается как JavaScript Object Notation). JSON - это простой, компактный формат для слабо структурированных деревьев узлов любой глубины, очень похожий на набор данных дерева свойств. Он менее структурирован, чем XML, и не имеет поддержки схемы, но имеет преимущество в том, что он проще, меньше и типизирован без необходимости сложной схемы.

Набор данных дерева свойств не типизирован и не поддерживает массивы как таковые. Таким образом, используется следующее отображение дерева свойств JSON:

  • Объекты JSON отображаются в узлы. Каждое свойство является узлом ребенка.
  • Массивы JSON отображаются в узлы. Каждый элемент представляет собой детский узел с пустым именем. Если узел имеет как названные, так и неназванные дочерние узлы, он не может быть отображен на представление JSON.
  • Значения JSON отображаются в узлы, содержащие значение. Однако вся информация о типе теряется; числа, а также буквы «нулевой», «истинный» и «ложный» просто сопоставляются с их струнной формой.
  • Узлы дерева свойств, содержащие как детские узлы, так и данные, не могут быть отображены.

JSON, за исключением потери информации о типе.

Например, этот JSON:

{
   "menu":
   {
      "foo": true,
      "bar": "true",
      "value": 102.3E+06,
      "popup":
      [
         {"value": "New", "onclick": "CreateNewDoc()"},
         {"value": "Open", "onclick": "OpenDoc()"},
      ]
   }
}

будет переведено на следующее дерево собственности:

menu
{
   foo true
   bar true
   value 102.3E+06
   popup
   {
      ""
      {
         value New
         onclick CreateNewDoc()
      }
      ""
      {
         value Open
         onclick OpenDoc()
      }
   }
}

ФорматINIкогда-то широко использовался в мире Windows. В настоящее время он является устаревшим, но все еще используется удивительно большим количеством приложений. Причина, вероятно, в его простоте, плюс в том, что Microsoft рекомендует использовать реестр в качестве замены, что не все разработчики хотят делать.

INI - это простой формат с ключевым значением с одним уровнем сечения. Таким образом, он менее богат, чем набор данных дерева свойств, что означает, что не все деревья свойств могут быть сериализованы как файлы INI.

Парсер INI создает узел дерева для каждой секции и узел ребенка для каждой собственности в этой секции. Все свойства, не находящиеся в секции, непосредственно добавляются в корневой узел. Пустые разделы игнорируются. (Они не ходят туда-обратно, как описано ниже.)

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

Пустой узел дерева считается пустым свойством. Невозможно создать пустые разделы.

Поскольку парсер Windows INI отбрасывает пробелы и не поддерживает цитирование, парсер дерева свойств следует этому примеру. Это означает, что значения свойств, содержащие промежуточное пространство, не являются круговыми.

Формат INFO был создан специально для библиотеки деревьев недвижимости. Он обеспечивает простой и эффективный формат, который можно использовать для сериализации деревьев свойств, которые в противном случае хранятся только в памяти. Он также может использоваться для любых других целей, хотя отсутствие широкого использования может оказаться препятствием.

INFO предоставляет несколько функций, которые делают его знакомым для программистов C++ и эффективным для наборов данных среднего размера, особенно тех, которые используются для ввода тестов. Он поддерживает побеги персонажей в стиле C, гнездование с помощью кудрявых брекетов и включение файлов через #include.

ИНФО также используется для визуализации свойств деревьев в этой документации.

Типичный файл INFO может выглядеть так:

key1 value1
key2
{
   key3 value3
   {
      key4 "value4 with spaces"
   }
   key5 value5
}

Вот более сложный файл, демонстрирующий все функции INFO:

; A comment
key1 value1   ; Another comment
key2 "value with special characters in it {};#\n\t\"\0"
{
   subkey "value split "\
          "over three"\
          "lines"
   {
      a_key_without_value ""
      "a key with special characters in it {};#\n\t\"\0" ""
      "" value    ; Empty key with a value
      "" ""       ; Empty key with empty value!
   }
}
#include "file.info"    ; included file

ИНФО круглосуточно, за исключением утраты комментариев и включения директив.


PrevUpHomeNext

Статья How to Populate a Property Tree раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 28. Boost.PropertyTree может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 28. Boost.PropertyTree ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:56:16/0.018619060516357/0