Archive for 二月 2014

使用boost的property_tree解析内存缓冲区中的XML

上一篇文章中是使用boost的property_tree来读取本地XML文件的方式来解析的,见http://www.zoudaokou.com/index.php/archives/628,但在某些情况下,我是从网络上接收到XML数据的,如果再将XML数据存在文件中,再用read_xml读取文件,就显示多余了,本文介绍直接使用property_tree将内存中保存的XML数据解析出来。

在property_tree中读取XML内容的函数是read_xml,它的参数有两种形式:

//第一种形式
template<class Ptree> void read_xml(std::basic_istream<typename Ptree::key_type::value_type> &stream,
                  Ptree &pt,
                  int flags = 0)
//第二种形式
template<class Ptree> void read_xml(const std::string &filename,
                  Ptree &pt,
                  int flags = 0,
                  const std::locale &loc = std::locale())

第二种形式中第一个参数是文件名,在第一种形式中,可以看到第一个参数为std::basic_istream &stream,那么我们可以使用字符串流istrstream,它是间接继承于basic_istream的,字符串流可以将内存中的数据保存起来,然后在调用read_xml的时候传入istrstream进行解析。
Continue reading ‘使用boost的property_tree解析内存缓冲区中的XML’ »

使用boost的property_tree解析XML

boost中提供了对配置文件读取的支持,它就是:property_tree,property_tree是一个保存了多个属性值的属性数据结构,可以用类似路径的简单方式访问任意节点的属性,而且每个节点都可以用类似STL的风格遍历子节点。property_tree特别适合于应用程序的配置数据处理,可以解析xml、ini、json和info四个格式的文本数据。

在处理四种格式的文件时,除包含头文件、读文件、写文件时有部分区别外,其他对文件内部数据操作时基本一致(因为文件格式都基本一致)。实际上,property_tree内部使用的就是一个小巧快速的开源XML解析器——rapidxml。

basic_ptree 是property_tree的核心基础。其接口像std::list。可以执行很多基本的元素操作,比如使用begin()、end()等。

此外还加入了操作属性树的get()、get_child()、get_value()、data()等额外的操作。

basic_ptree有两个重要的内部定义self_type和value_type。self_type是basic_ptree模板实例化后自身的类型,它也是子节点的类型。value_type是节点的数据结构,它是一个std::pair,它含有属性名(first)和节点自身(second)。

通常不使用basic_ptree,而是使用预定义的typedef。ptree、wptree、iptree、wiptree。前缀i表示忽略大小写,前缀w表示支持宽字符。
Continue reading ‘使用boost的property_tree解析XML’ »

中国神秘事件之双鱼玉佩

“双鱼玉佩”一个关于中国科学院新疆分院院长彭加木失踪的谜题。

此事已经过去二十多年,由于一位网友在社区发表了一个名为“中国有没有调查异事件的官方机构?”的帖子,使得此事如今才被大家知晓。

双鱼玉佩事件是灵异界必不可少的话题,然而相关资料却少之又少,与消息被封锁的说法相比,双鱼玉佩本身就是一件未被揭开的古老秘事,所以无解的可能性远远大于消息被封锁的可能性。

关于双鱼玉佩,有人说他是一种超自然物质机器,可以进行镜像复制,根据双鱼的原理,它有可能揭示了一个超十一维的物质空间的存在;也有人说他是一个行动代号,寓合了太极双鱼的含义。因为没有资料记载,所以也无从考究,一直是一个迷。

1
Continue reading ‘中国神秘事件之双鱼玉佩’ »

超可爱的404错误页面

404错误页面对于设计网站来说是最容易忽略的细节,其实很多时候都会因为技术原因呈现给用户错误页面。如何让这样的错误变成愉快的经历,这是绝对值得网页设计师思考的问题。有意思的404报错页面可以减少用户使用时的挫折感。

0
Continue reading ‘超可爱的404错误页面’ »

只有在夜里才能见的灿烂

闪烁的霓虹灯,车灯闪过留下轨迹的立交桥,漂亮的焰火以及灯会……无论是繁华喧嚣的大城市,还是寂静乡村里那弯明月,这些都是黑夜所带给我们的独特场景。细腻的光线,与音乐的云朵。

1
Continue reading ‘只有在夜里才能见的灿烂’ »

双重检查锁定模式

双重检查锁定模式(也被称为”双重检查加锁优化”,”锁暗示”(Lock hint))是一种软件设计模式用来减少并发系统中竞争和同步的开销。双重检查锁定模式首先验证锁定条件(第一次检查),只有通过锁定条件验证才真正的进行加锁逻辑并再次验证条件(第二次检查)。

该模式在某些语言在某些硬件平台的实现可能是不安全的。有的时候,这一模式被看做是反模式。

它通常用于减少加锁开销,尤其是为多线程环境中的单例模式实现“惰性初始化”。惰性初始化的意思是直到第一次访问时才初始化它的值。

如果你想在多线程编程中安全使用单件模式(Singleton),最简单的做法是在访问时对其加锁,使用这种方式,假定两个线程同时调用Singleton::getInstance方法,其中之一负责创建单件:

Singleton* Singleton::getInstance() {
    Lock lock;      // scope-based lock, released automatically when the function returns
    if (m_instance == NULL) {
        m_instance = new Singleton;
    }
    return m_instance;
}

Continue reading ‘双重检查锁定模式’ »