0
点赞
收藏
分享

微信扫一扫

Qt之xml文件解析

芝婵 2023-03-24 阅读 74

XML文件简介

  • XML - EXtensible Markup Language,可拓展标记语言

Qt中加载XML模块

.pro 文件中添加

QT += xml

Qt的XML访问方式


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();



举报

相关推荐

0 条评论