2012-02-27 82 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,但這是個人偏好的問題。