使用Boost读写XML文件使用Boost读写XML文件(Using Boost to read a

2019-05-13 19:29发布

有没有什么好的方法(和过于简单的方式)使用Boost读写XML文件?

我似乎无法找到任何简单的示例使用Boost读取XML文件。 你能指出我使用升压用于读取和写入XML文件的一个简单的示例?

如果不提升,有没有什么好的和简单的库来读写,你可以推荐XML文件? (它必须是一个C ++库)

Answer 1:

你应该尝试pugixml 重量轻,对C简单快速的XML解析器++

关于pugixml的最好的事情是XPath支持,这TinyXML的和RapidXML缺乏。

引用RapidXML的作者“我要感谢Arseny Kapoulkine为他的pugixml工作,这是这个项目的灵感”和“5% - 比pugixml快30%,最快的XML解析器,我知道。”他曾经对0.3版进行测试的pugixml,这已经达到了最近版本0.42。

下面是从pugixml文件的摘录:

其主要特点是:

  • 低存储器消耗和碎片(笼络pugxml是〜1.3倍,TinyXML的 - 〜2.5倍,的Xerces(DOM) - 〜4.3倍1)。 确切的数字可以与现有的解析器部分比较中可以看出。
  • 极高解析速度(笼络pugxml是〜6倍,TinyXML的 - 〜10倍,的Xerces-DOM - 〜17.6倍1
  • 极高的解析速度(当然,我重复自己,但它是如此之快,它在测试XML优于外籍2.8倍)2
  • 或多或少符合标准的(它会正确解析任何符合标准的文件,与DTD相关的问题除外)
  • 相当多的错误,无知的(它不会呛像你和我一样,外籍人士会;它将解析与错误的编码数据文件;等等)
  • 干净的界面(重重构的pugxml的一个)
  • 更多或更少的Unicode感知的(实际上,它假定输入数据的UTF-8编码,尽管它会容易地与ANSI工作 - 无UTF-16为现在(见今后的工作),用辅助转换功能(UTF-8 < - > UTF-16/32(无论是用于STD的默认:: wstring的&wchar_t的))
  • 完全符合标准的C ++代码(批准科莫严格模式); 图书馆是多平台(请参阅平台列表参考)
  • 高度的灵活性。 您可以通过解析选项控制文件的解析和DOM树建设的许多方面。

好吧,你可能会问 - 有什么收获? 一切都是那么的可爱 - 这是小型,快速,稳健,干净解析XML解决方案。 缺什么? 好吧,我们是公平的开发商 - 所以这里是一个不好的特性列表:

  • 内存消耗。 这可难倒了所有的基于DOM解析器,我知道的 - 但是当SAX解析器来了,就没有机会了。 您不能处理的内存小于4 GB 2 GB的XML文件 - 和做快。 虽然pugixml表现更好,比其他所有基于DOM解析器,因此,如果你坚持使用DOM,这不是一个问题。
  • 内存消耗。 好吧,我重复自己。 再次。 当其他解析器将允许您提供一个恒定存储(或者甚至为内存映射区)的XML文件,pugixml不会。 所以你必须将整个数据复制到一个非恒定的存储。 此外,应该解析器的生命周期内持续(对于多关于寿命的原因之一是写在下面)。 同样,如果你真行与DOM - 它不应该是一个问题,因为整体的内存消耗少(好,虽然你需要一个连续的内存块,这可能是一个问题)。
  • 缺乏验证,DTD处理,XML命名空间,编码妥善处理。 如果你需要的 - 去采取MSXML或XercesC之类的东西。


Answer 2:

TinyXML的可能是一个不错的选择。 至于提升:

还有就是Property_Tree库升压库 。 它已被接受,但支持似乎缺乏的时刻(编辑: Property_Tree现在是加速的一部分,因为1.41版本 ,阅读文档有关XML功能)。

丹尼尔Nuffer实行的是XML解析器的升压精神。



Answer 3:

还有TinyXML的 ,这是一个很好的和小的C ++库。 如果你正在寻找一个低级别的图书馆, RapidXML是一个很好的起点。



Answer 4:

升压使用RapidXML在描述如何填充属性树页的章节XML解析器

不幸的是,有没有XML解析器升压为写这篇文章的时间。 因此,该库包含了快速和微小RapidXML解析器(目前在1.13版本)提供XML解析的支持。 RapidXML不完全支持XML标准; 它不能解析的DTD,因此不能做全部的实体取代。

还请参阅XML升压教程 。

由于OP想要一个“使用boost读写XML文件简单的方法”,我提供了一个非常简单的例子如下:

<main>
    <owner>Matt</owner>
    <cats>
        <cat>Scarface Max</cat>
        <cat>Moose</cat>
        <cat>Snowball</cat>
        <cat>Powerball</cat>
        <cat>Miss Pudge</cat>
        <cat>Needlenose</cat>
        <cat>Sweety Pie</cat>
        <cat>Peacey</cat>
        <cat>Funnyface</cat>
    </cats>
</main>

(猫名与马特·马奥尼的主页 )

在C ++中相应的结构:

struct Catowner
{
    std::string           owner;
    std::set<std::string> cats;
};

read_xml()的使用:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

Catowner load(const std::string &file)
{
    boost::property_tree::ptree pt;
    read_xml(file, pt);

    Catowner co;

    co.owner = pt.get<std::string>("main.owner");

    BOOST_FOREACH(
       boost::property_tree::ptree::value_type &v,
       pt.get_child("main.cats"))
       co.cats.insert(v.second.data());

    return co;
}

write_xml()的使用:

void save(const Catowner &co, const std::string &file)
{
   boost::property_tree::ptree pt;

   pt.put("main.owner", co.owner);

   BOOST_FOREACH(
      const std::string &name, co.cats)
      pt.add("main.cats.cat", name);

   write_xml(file, pt);
}


Answer 5:

那么有升压XML解析没有具体的图书馆,但也有很多的选择,这里有一对夫妇: libxml的 , Xerces的 , 外籍人士

当然,你可以使用一些其他的图书馆在提升,以帮助您制作自己的图书馆,但很可能会相当的承诺。

这里是整个文章由IBM的主题。



Answer 6:

升压不提供XML解析器大气压。

POCO XML(的部分POCO C ++库 )是良好的和简单的。



Answer 7:

这样看来,升压序列化可以读取和写入到档案中的XML,如果这是足以满足您的目的。

更简单的XML与升压



Answer 8:

Definatelly使用TinyXML的*竖起大拇指*



Answer 9:

看看阿拉比卡



Answer 10:

如果你正在寻找只是DOM的功能,也有一些建议已经在这个线程。 我个人可能不会有一个图书馆缺乏XPath支持打扰,并在C ++中,将使用Qt。 还有TinyXPath和阿拉比卡声称拥有XPath支持,但我不能说任何关于这些。



Answer 11:

从我的经验,潜伏在Boost邮件列表上,似乎每一次XML来了作为一门学科,它被转​​移到一个关于Unicode的讨论。 然而,由于存在潜在的Unicode库,现在迫在眉睫的,我不认为这会花费太长的时间为一个XML库出现在那里。

在此期间,我也有使用TinyXML的过。

约RapidXML有趣的联系。 我会看看那个。



Answer 12:

一个警告。 我爱RapidXML,但分析UTF16时,它有一个很讨厌的错误。 原因是一些有效值崩溃。

我很想推荐pugixml - 但它缺乏命名空间的支持,我知道是要引起我的问​​题。



Answer 13:

有一个编程之夏建议工作,提高Boost.XML的现有提案: https://github.com/stefanseefeld/boost.xml但安杰提出Boost.PropertyTree是这个任务很好。 根据不同的XML大小和所需的验证支持自然。

还有这是最近在加速通讯录提出了一个库: http://www.codesynthesis.com/projects/libstudxml/doc/intro.xhtml



Answer 14:

什么boost.spirit?

在这里 ,他们表现出一种“ 迷你XML”解析器



Answer 15:

<?xml version="1.0"?>
<Settings>
  <GroupA>
      <One>4</One>
      <Two>7</Two>
      <Three>9</Three> 
  </GroupA>
  <GroupA>
      <One>454</One>
      <Two>47</Two>
      <Three>29</Three> 
  </GroupA>
  <GroupB>
      <A>String A</A>
      <B>String B</B>  
  </GroupB>  
</Settings>

有一个简单的方法来读取XML BOOST。 这个例子是用的std :: wstring的基础:

#include <string> 
#include <boost/property_tree/xml_parser.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/foreach.hpp>

bool CMyClass::ReadXML(std::wstring &full_path)
{
    using boost::property_tree::wptree;

    // Populate tree structure pt:
    wptree pt;
    std::wstringstream ss; ss << load_text_file(full_path); // See below for ref.
    read_xml(ss, pt);

    // Traverse pt:
    BOOST_FOREACH(wptree::value_type const& v, pt.get_child(L"Settings"))
    {
        if (v.first == L"GroupA")
        {
            unsigned int n1 = v.second.get<unsigned int>(L"One");
            unsigned int n2 = v.second.get<unsigned int>(L"Two");
            unsigned int n3= v.second.get<unsigned int>(L"Three");
        }
        else if (v.first == L"GroupB")
        {
            std::wstring wstrA = v.second.get<std::wstring>(L"A");
            std::wstring wstrB = v.second.get<std::wstring>(L"B");
        }
    };
}

要读取的属性只是一个稍微复杂一些。

-

只为参考:

std::wstring load_text_file(std::wstring &full_path)
{
    std::wifstream wif(full_path);

    wif.seekg(0, std::ios::end);
    buffer.resize(wif.tellg());
    wif.seekg(0);
    wif.read(buffer.data(), buffer.size());

    return buffer;
}


文章来源: Using Boost to read and write XML files
标签: c++ xml boost