如何填充属性树?
属性树可以解析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数组被映射到节点。每个元素都是一个带有空名称的子节点。如果一个节点具有命名和未命名的子节点,则不能将其映射到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.
Property tree nodes containing both child nodes and data cannot be mapped.
无法映射同时包含子节点和数据的属性树节点
这个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 serializer反转这个过程。它首先写出包含数据的根的每个子节点,但是没有子节点作为属性。然后,它为每个包含子节点的子节点创建一个部分,但是没有数据。各部分的子元素只能包含数据。如果根节点包含数据,或者根的任何子节点包含数据和内容,或者有超过三层的层次结构,那么它就是一个错误。也不能有任何重复的键。
一个空的树节点被假定为一个空的属性。没有办法创建空的部分。
由于Windows INI解析器丢弃了尾随空格,并且不支持引用,因此属性树解析器遵循了这个示例。这意味着包含尾随空格的属性值不会往返。无法映射包含子节点和数据的属性树节点。
来一个wiki上的例子:
; last modified 1 April 2001 by John Doe
[owner]
name=John Doe
organization=Acme Products
[database]
server=192.0.2.42 ; use IP address in case network name resolution is not working
port=143
file="acme payroll.dat"
这个ini文件的数据结构是没有xml强的,也没有json好用,是一个十足的弱得一笔的配置文件,连微软自己都建议开发者使用注册表,不要再使用这个ini文件了
INFO Parser
信息格式是专门为属性树库创建的。它提供了一种简单、高效的格式,可以用来序列化那些只存储在内存中的属性树。它也可以用于任何其他目的,尽管缺乏广泛的用途,但是,它确实是一种高效的结构
INFO提供了一些特性,这些特性使c++程序员更熟悉,对于中型数据集(尤其是用于测试输入的数据集)来说,这是非常有效的。它支持c样式的字符转义,通过花括号进行嵌套,
并通过#include文件包含,这是一个非常重要的功能,可以直接把文件模块化
INFO还用于在此文档中显示属性树
INFO还用于在此文档中显示属性树
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
信息往返,除了损失的评论和包括指令。
包含文件的功能,还需要再三看看看