2012-02-27 32 views
8

Tôi đang cố đọc một tệp XML trong chương trình C++ của mình. Các tập tin XML trông giống như sau:đọc một tệp XML trong chương trình C++

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

Ngay bây giờ tôi có thể nhìn vào các tập tin XML và cố gắng đọc nó như thế này:

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; 

Nói chung này có vẻ như một ý tưởng tồi và nó thực sự giới hạn cách tệp XML có thể được sửa đổi. Các giải pháp trên là rất thủ công và nếu bất cứ điều gì trong XML thay đổi có vẻ như là toàn bộ phương pháp đọc nó sẽ phải được thay đổi.

Có cách nào tốt hơn để thực hiện việc này không?

+0

Tôi không sử dụng C++ trong nhiều năm vì vậy tôi không thể đặt tên một nhưng google một trình phân tích cú pháp xml cho C++ và tôi chắc chắn bạn sẽ tìm thấy một cái gì đó. – Dan675

Trả lời

6

Bạn có thể sử dụng một số thư viện mà sẽ làm điều đó cho bạn. Nếu bạn đang làm việc trên nền tảng Windows, bạn có thể sử dụng MSXML là một phần của hệ thống.

Kiểm tra câu hỏi này: Read Write XML File In C++

thư viện phổ biến khác: , ,

+0

Âm thanh MSXML giống như nó có thể là những gì tôi đang tìm kiếm. Nó là một chương trình Windows vì vậy tôi sẽ cố gắng này đầu tiên. Cảm ơn vì tiền hỗ trợ. – user974967

+1

Bỏ phiếu cho RapidXml vì nó là thư viện chỉ tiêu đề không có phụ thuộc. –

0

Bạn có thể sử dụng thư viện POCO trong đó có chức năng cho phân tích cú pháp XML

2

tăng cây bất động sản hoạt động rất tốt với xml, tôi sẽ sử dụng đó.

+0

Tôi không nghĩ rằng bạn đạt được nhiều hơn thư viện RapidXml mà Boost sử dụng cho cây bất động sản. Trừ khi bạn đã sử dụng Boost, điều này sẽ thêm một phụ thuộc lớn thay vì một tệp tiêu đề duy nhất (RapidXml). –

+0

thực sự, tất cả phụ thuộc vào những gì các thư viện mọi người đang sử dụng và nếu họ cần khả năng tương thích đa nền tảng – ikku100

1

Trong nguồn đa nền tảng, tôi thường sử dụng trình đọc XML Qt.

Bạn có 3 cách để đọc:

  1. Qt core QXmlStreamReader - cách Qt đọc XML
  2. SAX2 reader - đọc sax2 tiêu chuẩn với xử lý nội dung lớp
  3. DOM reader - đọc tài liệu DOM với các nút XML

Nếu bạn viết phần mềm chỉ dành cho Windows, bạn nên sử dụng MSXML 6. Vì Windows XP SP3 MSXML 6.0 là một phần của HĐH.

Trên Linux, bạn nên sử dụng libxml2.

+0

Tại sao anh ta nên giải quyết với một thư viện C XML khi anh ta có thể có một C++? – pmr

+0

@pmr: tại sao không? Trong nhiều trường hợp, thư viện C tinh khiết nhanh hơn. libxml2 thường được sử dụng và nó thường là trên máy, do đó, anh ta không làm cho một phụ thuộc nhiều hơn. – Naszta

+0

Trong kinh nghiệm của tôi, các thư viện C thường cảm thấy kỳ lạ trong thành ngữ C++ và yêu cầu một số lượng gói và không tích hợp quá tốt với các mã khác và các cơ sở mã lớn hơn. Nhưng điều đó có lẽ rất chủ quan. – pmr

1

Bạn sẽ cần trình phân tích cú pháp XML. Có một bó ngoài kia:

  • TinyXML
  • pugiXML
  • POCO đi kèm với một phân tích cú pháp XML (và nhiều hơn nữa) cũng
  • QtXml chỉ khi bạn đã sử dụng Qt

Yêu thích cá nhân của tôi là pugiXML nhưng đó là một câu hỏi về sở thích cá nhân.

Các vấn đề liên quan