Boost.PropertyTree 如何填充属性树?

如何填充属性树?

属性树可以解析4种文件,现在,我就将其一一列出

  • XML
  • JSON
  • INI
  • INFO
 

XML Parser

XML格式是用于以文本形式存储信息的行业标准。不幸的是,在撰写本文时,没有XML解析器。因此,该库包含快速和微小的RapidXML解析器(当前版本1.13),以提供XML解析支持。RapidXML并不完全支持XML标准;它不能解析dtd,因此不能进行完全的实体替换。【说一句废话,其实,也没有要这个东西完全支持XML的解析,因为,完全的XML的解析,可以使用更加专业的库,如TinyXML2之类的,这个XML解析,仅仅是解析,类似于配置文件之类的XML,超级强大的XML的解析,反而用不上的
 
默认情况下,解析器将保留大部分空白,但删除仅包含空白的元素内容。【也就是,只有空白的东西,他就不保留了】
编码的whitespaces(例如,#32;)在这方面不算作空白。您可以通过trim_whitespace标志,如果您想要所有的引导和拖尾空白,并且所有连续的空白都折叠成一个单独的空间

请注意,RapidXML不理解编码规范。如果传递一个字符缓冲区,它假定数据已经正确编码;如果您传递给它一个文件名,它将使用您给它的地区的字符转换来读取文件(如果您不给它的话,则使用全局语言环境)。这意味着,为了将一个utf -8编码的XML文件解析为wptree,您必须提供一个替代的语言环境,或者直接或通过替换全局变量

XML /property 树转换模式(read_xml和write_xml):
  • 每个XML元素对应于一个属性树节点。子元素对应于节点的子元素
  • XML元素的属性存储在subkey 中。属性节点中每个属性有一个子节点。当没有属性时,节点的存在没有保证或必要。
  • XML注释存储在名为的节点中,除非通过标记启用注释忽略。
  • 文本内容以两种方式存储,这取决于标记。默认方式将所有文本节点连接起来,并将它们存储为元素节点的数据。这样,整个内容可以方便地读取,但是文本和子元素的相对顺序丢失了。另一种方法是将每个文本内容存储为一个单独的节点,都称为<xmltext>
  • XML存储编码不能完美地往返。读写周期丢失了修剪的空白、低级格式化信息以及正常数据和CDATA节点之间的区别。只在启用时保留注释。一个写读周期丢失了修剪的空白;也就是说,如果原始树的字符串数据以空格开始或结束,那么空格就会丢失。
 

JSON Parser

JSON格式是一种数据交换格式,源自JavaScript的对象文字符号。(JSON代表JavaScript对象符号。)JSON是一种简单的、紧凑的格式,适用于任何深度的松散结构节点树,非常类似于属性树数据集。它不像XML那样结构化,也没有模式支持,但是它的优点是更简单、更小,而且不需要复杂的模式
 
属性树数据集没有类型,也不支持数组。因此,使用以下JSON /属性树映射:
JSON objects are mapped to nodes. Each property is a child node.
  • Json对象是映射到节点集上,每个数显是子节点
JSON arrays are mapped to nodes. Each element is a child node with an empty name. If a node has both named and unnamed child nodes, it cannot be mapped to a JSON representation.
JSON数组被映射到节点。每个元素都是一个带有空名称的子节点。如果一个节点具有命名和未命名的子节点,则不能将其映射到JSON表示。

JSON values are mapped to nodes containing the value. However, all type information is lost; numbers, as well as the literals "null", "true" and "false" are simply mapped to their string form.

JSON值映射到包含值的节点。但是,所有类型信息都丢失了;数字,以及文字“空”、“真”和“假”都被简单地映射到它们的字符串形式。


Property tree nodes containing both child nodes and data cannot be mapped.
无法映射同时包含子节点和数据的属性树节点
 
这个json树:
  1. {
  2. "menu":
  3. {
  4. "foo":true,
  5. "bar":"true",
  6. "value":102.3E+06,
  7. "popup":
  8. [
  9. {"value":"New","onclick":"CreateNewDoc()"},
  10. {"value":"Open","onclick":"OpenDoc()"},
  11. ]
  12. }
  13. }
被映射为:
  1. menu
  2. {
  3. foo true
  4. bar true
  5. value 102.3E+06
  6. popup
  7. {
  8. ""
  9. {
  10. value New
  11. onclick CreateNewDoc()
  12. }
  13. ""
  14. {
  15. value Open
  16. onclick OpenDoc()
  17. }
  18. }
  19. }
这个是一个属性树
 
INI格式曾经在Windows世界中被广泛使用。它现在已被弃用,但仍然被大量的应用程序使用。原因可能是它的简单性,加上Microsoft推荐使用注册表作为替代,而不是所有的开发人员都想这么做。

INI是一个简单的键值格式,只有一个层次的切片。因此,它不像属性树数据集那样丰富,这意味着不是所有的属性树都可以被序列化为INI文件。

INI解析器为每个部分创建一个树节点,以及该部分中每个属性的子节点。所有的属性都不会直接添加到根节点。空的部分将被忽略。(如下面所述,他们不会往返。)

INI serializer反转这个过程。它首先写出包含数据的根的每个子节点,但是没有子节点作为属性。然后,它为每个包含子节点的子节点创建一个部分,但是没有数据。各部分的子元素只能包含数据。如果根节点包含数据,或者根的任何子节点包含数据和内容,或者有超过三层的层次结构,那么它就是一个错误。也不能有任何重复的键。
一个空的树节点被假定为一个空的属性。没有办法创建空的部分。
由于Windows INI解析器丢弃了尾随空格,并且不支持引用,因此属性树解析器遵循了这个示例。这意味着包含尾随空格的属性值不会往返。无法映射包含子节点和数据的属性树节点。
 
来一个wiki上的例子:
  1. ; last modified 1April2001 by JohnDoe
  2. [owner]
  3. name=JohnDoe
  4. organization=AcmeProducts
  5. [database]
  6. server=192.0.2.42; use IP address in case network name resolution is not working
  7. port=143
  8. file="acme payroll.dat"
这个ini文件的数据结构是没有xml强的,也没有json好用,是一个十足的弱得一笔的配置文件,连微软自己都建议开发者使用注册表,不要再使用这个ini文件了
 

INFO Parser

信息格式是专门为属性树库创建的。它提供了一种简单、高效的格式,可以用来序列化那些只存储在内存中的属性树。它也可以用于任何其他目的,尽管缺乏广泛的用途,但是,它确实是一种高效的结构

INFO提供了一些特性,这些特性使c++程序员更熟悉,对于中型数据集(尤其是用于测试输入的数据集)来说,这是非常有效的。它支持c样式的字符转义,通过花括号进行嵌套,
并通过#include文件包含,这是一个非常重要的功能,可以直接把文件模块化
INFO还用于在此文档中显示属性树
 
INFO的格式:
  1. key1 value1
  2. key2
  3. {
  4. key3 value3
  5. {
  6. key4 "value4 with spaces"
  7. }
  8. key5 value5
  9. }
 
下面是一个复杂的INFO格式:
  1. ; A comment
  2. key1 value1 ;Another comment
  3. key2 "value with special characters in it {};# ""
  4. {
  5. subkey "value split "
  6. "over three"
  7. "lines"
  8. {
  9. a_key_without_value ""
  10. "a key with special characters in it {};# """"
  11. "" value ;Empty key with a value
  12. """";Empty key with empty value!
  13. }
  14. }
  15. #include"file.info"; included file
 
信息往返,除了损失的评论和包括指令。
 
包含文件的功能,还需要再三看看看
原文地址:https://www.cnblogs.com/xujintao/p/8325938.html