2012-02-27 145 views
8

我正在尝试在我的C++程序中读取XML文件。 XML文件看起来是这样的:在C++程序中读取XML文件

<?xml version="1.0" encoding="utf-8"?> 
<myprogram> 
<configuration> 
<window> 
<height> 300 </height> 
<width> 500 </width> 
</window> 
</configuration> 
</myprogram> 

现在我可以看一下XML文件,并试图这样来阅读:

ifstream in("mydata.xml"); 

//ignore the <?xml line 
in.ignore(200, '\n'); 

//i know that the first value i want is the window height so i can ignore <myprogram> <configuration> and <window> 

//ignore <myprogram> 
in.ignore(200, '\n'); 

//ignore <configuration> 
in.ignore(200, '\n'); 

//ignore <window> 
in.ignore(200, '\n'); 

string s; int height; 

//okay, now i have my height 
in >> s >> height; 

一般来说,这似乎是一个坏主意,它真的限制了XML文件的修改方式。上述解决方案非常手动,如果XML中的任何内容发生更改,似乎读取它的整个方法都必须更改。

有没有更好的方法来做到这一点?

+0

我没有带用C++多年,所以我不能命名一个但谷歌的XML解析器C++,我相信你会找到的东西。 – Dan675 2012-02-27 22:21:12

回答

6

你可以使用一些库,会为你做POCO库。如果你在Windows平台上工作,你可以使用已经是系统一部分的MSXML

检查这个问题:Read Write XML File In C++

其他流行的库:

+0

MSXML听起来像它可能是我正在寻找。这是一个Windows程序,所以我会先试一试。谢谢你的提示。 – user974967 2012-02-27 22:52:04

+1

对RapidXml进行投票,因为它是仅包含头文件的库,不具有依赖关系。 – 2012-03-06 16:44:27

0

您可以使用具有功能解析XML

2

提升属性树的作品非常好,XML,我会使用它。

+0

我认为你不会获得Boost用于属性树的RapidXml库。除非你已经使用Boost,否则这将会增加一个大的依赖项,而不是单个头文件(RapidXml)。 – 2012-03-06 16:45:07

+0

事实上,这一切都取决于图书馆的人已经在使用,如果他们需要跨平台兼容性 – ikku100 2015-02-16 10:32:32

1

在多平台源代码中,我通常使用Qt XML阅读器。

你有3种方式为:

  1. Qt core QXmlStreamReader - XML阅读Qt的方式
  2. SAX2 reader - 与内容处理
  3. 标准SAX2读者
  4. DOM reader - DOM文档阅读器XML节点

如果您只编写Windows软件,则应使用MSXML 6。由于Windows XP SP3 MSXML 6.0是操作系统的一部分。

在Linux上,您应该使用libxml2

+0

为什么要他与C XML库定居时,他可以有一个C++吗? – pmr 2012-02-27 22:54:46

+0

@pmr:为什么不呢?在许多情况下,纯C库更快。通常使用libxml2,它通常在机器上,所以他不再创建一个依赖关系。 – Naszta 2012-02-27 22:57:50

+0

根据我的经验,C库在习惯C++中经常感到奇怪,并且需要一定数量的包装,并且不能与其他代码和较大的代码库很好地集成。但这可能是非常主观的。 – pmr 2012-02-27 23:00:02

1

您将需要一个XML解析器。还有一堆那里:

我个人最喜欢的是pugiXML,但这是个人偏好的问题。