Qt之XML(DOM)
DOM(Document Object Model - 文档对象模型)定义了访问和操作 XML 文档的标准方法。
DOM 把 XML 文档作为树结构来查看,能够通过 DOM 树来访问所有元素。可以修改或删除它们的内容,并创建新的元素。元素及其文本、属性都被认为是节点。
QDomDocument 类表示整个 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的主要访问。
因为元素、文本节点、注释、处理指令等不能存在于文档的上下文之外,所以文档类还包含创建这些对象所需的工厂函数。创建的节点对象有一个 ownerDocument() 函数,将它们与在其上下文中创建的文档相关联。最常用的 DOM 类是 QDomNode、QDomDocument、QDomElement 和 QDomText。
解析的 XML 在内部由对象树表示,可以使用各种 QDom 类访问,所有的 QDom 类只引用内部树中的对象。一旦最后一个 QDom 对象引用它们或 QDomDocument 本身被删除,DOM 树中的内部对象将被删除。
元素、文本节点等的创建使用此类中提供的各种工厂函数完成。使用 QDom 类的默认构造函数只会导致无法操作或插入到 Document 中的空对象。
QDomDocument 类具有创建文档数据的多个函数,例如:createElement()、createTextNode()、createComment()、createCDATASection()、createProcessingInstruction()、createAttribute() 和 createEntityReference()。这些函数中的一些具有支持命名空间的版本,即:createElementNS() 和 createAttributeNS()。createDocumentFragment() 函数用于保存文档的各部分,这对于处理复杂文档很有用。
文档的整个内容使用 setContent() 设置。此函数解析的字符串,作为一个 XML 文档以及创建表示文档的 DOM 树传递。根元素可以使用 documentElement() 来获取,文档的文本表示可以使用 toString() 获取。
注意:如果 XML 文档较大,DOM 树可能最终会保留大量内存。对于这样的文档,QXmlStreamReader 或 QXmlQuery 类可能是更好的解决方案。
可以使用 importNode() 将来自另一个文档的节点插入到文档中。
可以根据 elementsByTagName() 或 elementsByTagNameNS() 获取具有特定标记的所有元素的列表。
?xml version="1.0" encoding="UTF-8" standalone="yes"? !--纯正开源之美,有趣、好玩、靠谱。。。-- ?xml-stylesheet type="text/css" href="style.css"? Blogs Version="1.0" Blog 作者 一去丶二三里 /作者 主页 http://blog.csdn.net/liang19890820 /主页 个人说明 青春不老,奋斗不止! /个人说明 /Blog /Blogs
详细说明见: Qt之生成XML(QXmlStreamWriter)
函数 writeXML() 主要用于生成 XML,将生成的内容写入 Blogs.xml 文件中:
QDomProcessingInstruction xmlInstruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\""); QDomComment comment = doc.createComment(QString::fromLocal8Bit("纯正开源之美,有趣、好玩、靠谱。。。")); QDomProcessingInstruction styleInstruction = doc.createProcessingInstruction("xml-stylesheet", "type=\"text/css\" href=\"style.css\""); doc.appendChild(xmlInstruction); // 开始文档(XML 声明) doc.appendChild(comment); // 注释 doc.appendChild(styleInstruction); // 处理指令 // 根元素 Blogs QDomElement root = doc.createElement("Blogs"); root.setAttribute("Version", "1.0"); // 属性 doc.appendChild(root); // 元素 Blog QDomElement child = doc.createElement("Blog"); root.appendChild(child); // 元素 作者 、 主页 、 个人说明 QDomElement author = doc.createElement(QString::fromLocal8Bit("作者")); QDomElement home = doc.createElement(QString::fromLocal8Bit("主页")); QDomElement instruction = doc.createElement(QString::fromLocal8Bit("个人说明")); child.appendChild(author); child.appendChild(home); child.appendChild(instruction); // 元素的文本数据 QDomText authorText = doc.createTextNode(QString::fromLocal8Bit("一去丶二三里")); QDomText homeText = doc.createTextNode("http://blog.csdn.net/liang19890820"); QDomText instructionText = doc.createTextNode(QString::fromLocal8Bit("青春不老,奋斗不止!")); author.appendChild(authorText); home.appendChild(homeText); instruction.appendChild(instructionText); // 保存 XML 文件 QString strFile("Blogs.xml"); QFile file(strFile); if (file.open(QFile::WriteOnly | QFile::Text)) { // 只写模式打开文件 QTextStream out( file); doc.save(out, QDomNode::EncodingFromDocument); file.close(); }
首先,根据 QDomDocument 构造一个 DOM 文档。通过调用其工厂方法 create…() 创建对应的节点,然后利用 appendChild() 进行添加,进而构建一个对象树。
/**********根元素之上(XML 声明、注释等)**********/ QDomNode node = root.previousSibling(); while (!node.isNull()) { switch (node.nodeType()) { case QDomNode::ProcessingInstructionNode : { QDomProcessingInstruction instruction = node.toProcessingInstruction(); qDebug() instruction.target() instruction.data(); if (QString::compare(instruction.target(), "xml") == 0) { // 开始文档(XML 声明) // ... } else if (QString::compare(instruction.target(), "xml-stylesheet") == 0) { // 处理指令 // ... break; case QDomNode::CommentNode : { QDomComment comment = node.toComment(); qDebug() comment.data(); break; default: break; node = node.previousSibling(); /**********元素 Blog **********/ node = root.firstChild(); // 返回根节点的第一个子节点 while (!node.isNull()) { if (node.isElement()) { QDomElement element = node.toElement(); // 尝试将节点转换为元素 if (!element.isNull()) { // 节点的确是一个元素 qDebug() element.tagName(); /**********遍历元素 作者 、 主页 、 个人说明 **********/ QDomNodeList list = element.childNodes(); for (int i = 0; i list.count(); i++) { node = list.at(i); if (node.isElement()) { element = node.toElement(); qDebug() element.tagName() element.text(); if (QString::compare(element.tagName(), QStringLiteral("作者")) == 0) { // ... } else if (QString::compare(element.tagName(), QStringLiteral("主页")) == 0) { // ... } else if (QString::compare(element.tagName(), QStringLiteral("个人说明")) == 0) { // ... node = node.nextSibling(); }
和 XML 的生成类似,读取是写入的逆过程。读取的入口根据 QDomDocument 调用 documentElement() 返回的根元素。通过根元素,可以获取到任何我们想要的节点,例如:通过 previousSibling() 向上查找兄弟节点;同理,也可以调用 nextSibling() 向下查找。示例中,我们使用 while() 循环,利用 nextSibling() 反复查找根节点 Blogs 下的所有 Blog 子节点 。在读取 Blog 的过程中,通过 childNodes() 返回其下的所有节点,然后进行遍历,tagName() 返回标签的名称,text() 则返回相应的内容。
注意:进行解析的时候,尽可能的判断节点的类型,通过调用 nodeType() 或者 isElement() 函数均可。
Qt 利用XML文档,写一个程序集合 一 接到领导需求安排,说公司未来的硬件设备会越来越多,与每个设备对应的设备检测和设置程序也会增多。导致软甲太多,不好掌控。所以希望做一个完整的软件,但是呢,每个子程序还得独立,应为每个用户购买的设备不是一样的。
相关文章
- Qt-Button使用QSS变图片按钮(QSS图片分割)
- golang encoding/xml 解析多个根节点的XML文件
- Qt音视频开发43-人脸识别服务端
- 推荐一个好用的Chrome扩展,专门处理xml的,名叫XML Tree
- paip.c++ qt creator svn 设置以及使用总结.
- Qt DOM读取XML文档
- Qt XML流读写XML
- Qt QDomDocument读写XML文件
- Qt QVector常见使用方法
- 已解决(Python读取xml文件报错)xmL.etree.ELementTree.ParseError:not well-formed (invalid token): Line
- C++Qt高级——QMake快速入门
- Qt串口通信接收数据不完整_qt串口接收数据
- QT开发教程:QScroller实现home界面滑动效果
- 1、QT基础——Qt概述
- qt交叉编译报错::-1: error: The Qt version is invalid: Qt version is not properly installed,please run make
- Qt学习一门:直接使用QT具
- Qt Model/View(模型/视图)结构(无师自通)