XML文件簡介
- XML - EXtensible Markup Language,可拓展標記語言
Qt中加載XML模塊
.pro 文件中添加
QT += xml
Qt的XML訪問方式
引用:https://blog.csdn.net/liang19890820/article/details/52805902
Qt 提供了兩種訪問 XML 文檔的方式:DOM 和 SAX。
- DOM 方式:將 XML 文檔轉換為樹形結構存儲到內存中,再進行讀取,消耗的內存比較多。此外,由於文檔都已經存儲到內存,所以需要頻繁實現修改等操作時,使用起來比較方便。
- SAX 方式:相比於 DOM,SAX 是一種速度更快,更有效的方法,它逐行掃描文檔,一邊掃描一邊解析(由於應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中,這對於大型文檔的解析是個巨大優勢)。而且相比於 DOM,SAX 可以在解析文檔的任意時刻停止解析。但操作復雜,很難修改 XML 數據。
DOM
類 | 描述 |
---|---|
QDomAttr | 表示一個 QDomElement 的屬性 |
QDomCDATASection | 表示一個 XML CDATA 部分 |
QDomCharacterData | 表示 DOM 中的一個通用字符串 |
QDomComment | 表示一個 XML 注釋 |
QDomDocument | 表示一個 XML 文檔 |
QDomDocumentFragment | QDomNodes 樹,通常不是一個完整的 QDomDocument |
QDomDocumentType | 表示文檔樹中的 DTD |
QDomElement | 表示 DOM 樹中的一個元素 |
QDomEntity | 代表一個 XML 實體 |
QDomEntityReference | 代表一個 XML 實體引用 |
QDomImplementation | DOM 實現的功能的信息 |
QDomNamedNodeMap | 包含一個節點集合,節點可以通過名字來訪問 |
QDomNode | 一個 DOM 樹中所有節點的基類 |
QDomNodeList | QDomNode 對象列表 |
QDomNotation | 代表一個 XML 表示法 |
QDomProcessingInstruction | 代表 XML 處理指令 |
QDomText | 表示解析的 XML 文檔中的文本數據 |
說明:
- XML的每級元素(QDomElement),也可以稱之為結點(QDomNode),QDomElement繼承自QDomNode;
- QDomNode可以使用
toElement()
方法轉換成QDomElement;
常用方法
QDomDocument doc("test_xml");
QFile xml_file("FiltersConf.xml");
if(!doc.setContent(&xml_file)) //也可以傳入字符串
{
qDebug()<<"set content fail";
return 0;
}
QDomElement root_element = doc.documentElement();//獲取xml文件的根元素
qDebug()<<root_element.tagName(); //使用tagName()方法獲取元素的標簽名
QDomNode node = root_element.firstChild();//獲取第一個子結點
QString attr = node.toElement().attribute("name");//獲取屬性
while(!node.isNull())
{
qDebug()<<"-"<<node.toElement().tagName();
node = node.nextSibling(); //獲取同級的結點
}
寫入XML
QDomDocument document;
//xml頭部的<?xml version="1.0" encoding="UTF-8"?>
QDomProcessingInstruction instruction = document.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
document.appendChild(instruction);
QDomElement root_node = document.createElement("transpond");//創建根結點
document.appendChild(root_node); //添加根結點
QDomElement element = document.createElement("machine");//創建元素結點
element.setAttribute("type", "machine");
root_node.appendChild(element);//元素結點添加到根結點下
QDomElement item_element = document.createElement("machine-item");//創建item結點
item_element.setAttribute("type", "11");
item_element.setAttribute("name", "22");
item_element.setAttribute("device-code", "33");
item_element.setAttribute("ip", "44");
item_element.setAttribute("sync-time", "55");
//寫入文件
QFile file(pConfigManager->GetMachineInfoFile());
if(!file.open(QIODevice::ReadWrite | QIODevice::Truncate))
{
return false;
}
QTextStream in(&file);
document.save(in, 4);
file.close();