Cơ bản về XML
Cũng tương tự HTML là ngôn ngữ đánh dấu văn bản, nhưng XML 1 ưu điểm nổi là các thẻ đều do người dùng tự định nghĩa, không giống như HTML là phải tuân thủ theo các thẻ được xây dựng sẵn.
Ví dụ về HTML và XML:
1 ví dụ XML có cấu trúc phúc tạp hơn:
an evil sorceress, and her own childhood to become queen
Lưu ý: Tài liệu XML bắt buộc phải có 1 thẻ root. Thẻ root này sẽ chứa tất cả các thẻ con nằm trong nó. Thẻ root ở hai ví dụ trên là và .
Để hiểu rõ hơn về tài liệu XML có thể tham khảo bài viết Cơ Bản Về XML.
Thư viện TinyXML
Giới thiệu
TinyXML là 1 thư viện mã nguồn mở C++, thao tác với tài liệu XML thông qua mô hình DOM (Document Object Model).
Với thông tin về mỗi lớp như sau:
Tên Class
Thông tin về Class
TiXmlAttribute
Đại diện cho thuộc tính, là 1 cặp name-value
TiXmlBase
Là class cơ sở của tất cả mọi class trong TinyXML
TiXmlComment
TiXmlDeclaration
Đại diện cho những khai báo ở đầu file trong tài liệu XML
TiXmlDocument
Đại diện cho 1 tài liệu XML, chứa tất cả các thông tin về tài liệu này.
TiXmlElement
Đại diện cho 1 node trong tài liệu XML
TiXmlNode
Là class cơ sở trong mô hình DOM
TiXmlText
Đại diện cho nội dung của 1 node trong tài liệu XML
Thêm thư viện vào Project
Tạo 1 Empty Project Console C++ với tên Project là Demo_TinyXML. Sau đó download thư viện và giải nén. Trong thư mục vừa mới giải nén chỉ quan tâm tới những file cần thiết là các file:
Copy những file này vào thư mục project.
Và thêm #include "tinyxml.h" vào đầu những file muốn sử dụng thư viện này:
#include "tinyxml.h"Thao tác với tài liệu XML
Trong bài viết này sẽ thao tác với tài liệu XML có nội dung như sau, việc thao tác với những tài liệu XML khác hoàn toàn tương tự.
Read
Tạo 1 file có tên là Authors.xml có nội dung như trên và copy file này vào thư mục project.
Các bước để đọc 1 tài liệu XML:
Bước 1: Load tài liệu lên bộ nhớ.
Bước 2: Lấy thông tin của node gốc (root element).
Bước 2: Lần lượt truy vấn qua các node con để lấy được thông tin cần thiết.
Đọc tài liệu Authors.xml như sau:
Load tài liệu:
TiXmlDocument doc("Authors.xml"); if (!doc.LoadFile()) { printf("%s", doc.ErrorDesc()); return -1; }Lấy thông tin node gốc
TiXmlElement* root = doc.RootElement();Truy vấn qua từng node và xuất thông tin:
int id; cout << id << " "; cout << id << " ";Kết quả:
Giả sử có rất nhiều author, thì giải pháp tốt nhất là sẽ sử dụng vòng lặp để duyệt qua tất cả các node:
TiXmlElement* author = nullptr; int id; { cout << id << " "; }Có thể tìm hiểu rõ hơn về các phương thức FirstChild , , PreviousSibling , NextSibling , NextSiblingElement để có thể truy vấn trong tài liệu XML 1 cách hiệu quả.
Write
Ở phần này sẽ tạo lại 1 tài liệu XML có nội dung như Authors.xml nhưng lưu lại với tên là Author_Write.xml.
Tài liệu XML là 1 mô hình phân cấp. Nghĩa là 1 1 node trong tài liệu XML đồng thời là cha của node này và là con của node kia. Ví dụ trong tài liệu Authors.xml thì Authors là cha của các , các là anh chị em với nhau. Mỗi đều có thuộc tính và có hai con là và . Cách tạo tài liệu XML cũng dựa trên điều này. Tạo ra các TiXmlElement và dùng phương thức có prototype như sau để thể hiện mối quan hệ trên:
TiXmlNode* TiXmlNode::LinkEndChild (TiXmlNode * addThis)Tạo 1 đối tượng TiXmlDocument và thêm các node TiXmlDeclaration , TiXmlComment , đối tượng root TiXmlElement vào tài liệu này:
TiXmlDocument doc; TiXmlDeclaration *dec = new TiXmlDeclaration("1.0", "utf-8", ""); doc.LinkEndChild(dec); TiXmlComment *cmt = new TiXmlComment("Demo read, write, edit XML document using TinyXML library"); doc.LinkEndChild(cmt); TiXmlElement* root = new TiXmlElement("Authors"); doc.LinkEndChild(root);Tạo hai đối tượng Author và thêm vào node root
TiXmlElement* author1 = new TiXmlElement("Author"); TiXmlElement* author2 = new TiXmlElement("Author");Với mỗi Author ta sẽ tạo hai node là , và set nội dung cho chúng, sau đó add vào node Author tương ứng.
Author1 TiXmlElement* author1_name = new TiXmlElement("Name"); TiXmlText* name_content_1 = new TiXmlText("Kevin La"); TiXmlElement* author1_age = new TiXmlElement("Age"); TiXmlText* age_content_1 = new TiXmlText("27");Author2
TiXmlElement* author2_name = new TiXmlElement("Name"); TiXmlText* name_content_2 = new TiXmlText("Nguyen Van Nghia"); TiXmlElement* author2_age = new TiXmlElement("Age"); TiXmlText* age_content_2 = new TiXmlText("20");Lưu tài liệu XML.
doc.SaveFile("Authors_Write.xml"); TiXmlDocument doc; TiXmlDeclaration *dec = new TiXmlDeclaration("1.0", "utf-8", ""); doc.LinkEndChild(dec); TiXmlComment *cmt = new TiXmlComment("Demo read, write, edit XML document using TinyXML library"); doc.LinkEndChild(cmt); TiXmlElement* root = new TiXmlElement("Authors"); doc.LinkEndChild(root); TiXmlElement* author1 = new TiXmlElement("Author"); TiXmlElement* author2 = new TiXmlElement("Author"); TiXmlElement* author1_name = new TiXmlElement("Name"); TiXmlText* name_content_1 = new TiXmlText("Kevin La"); TiXmlElement* author1_age = new TiXmlElement("Age"); TiXmlText* age_content_1 = new TiXmlText("27"); TiXmlElement* author2_name = new TiXmlElement("Name"); TiXmlText* name_content_2 = new TiXmlText("Nguyen Van Nghia"); TiXmlElement* author2_age = new TiXmlElement("Age"); TiXmlText* age_content_2 = new TiXmlText("20"); doc.SaveFile("Authors_Write.xml");Build và chạy chương trình, sau đó mở thư mục chứa project sẽ thấy file Authors_Write.xml được tạo ra với nội dung giống như file Authors.xml.
Download demo
Demo_TinyXML_Stdio.zip