Qt之XML(一) DOM
Qt之XML(一)
文档名称 |
Qt之XML |
创建时间 |
2012-10-10 |
修改时间 |
2012-10-10 |
创建人 |
Baifx |
简介(收获) |
最近开始使用QtXml,学习了一番,写了几个小测试程序。
Qt的XML模块支持流行的两种XML解析方法,DOM和SAX。两种方法各有优缺点,DOM方法将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些。SAX是一种事件驱动的XML API,速度快,但不便于随机访问任意节点。通常根据实际应用选用合适的解析方法。在Qt4.3中还引入了一种基于流的XML解析方法。
DOM
DOM(文件对象模型,Document Object Model)是W3C开发的独立于平台和语言的接口,它可以使程序和脚本能够动态地存取和更新XML文档的内容、结构和风格。DOM有Level1、2和3三个级别的规范。Qt支持DOM Level2规范。
DOM在内存中将XML文件表示为一棵树,用户通过API可以随意地访问树的任意节点内容。在Qt中,XML文档自身使用QDomDocument表示,所有的节点类都从QDomNode继承。其继承关系如下图所示:
QDomDocument::setContent()完成XML文档的设置,他从QFile对象中读取XML数据并检测XML文档的编码。setContent()有几种重载形式,可以分别从QByteArray、QString、QIODevice、QXmlInputSource中读取XML数据。
实例一使用DOM方法生成XML文件:
int main(int argc, char *argv[])
{
QFile file( "domwrite.kdevelop" );
if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
return 0;
QDomDocument doc;
QDomText text;
QDomElement element;
QDomProcessingInstruction instruction;
instruction = doc.createProcessingInstruction( "xml", "version = \'1.0\'" );
doc.appendChild( instruction );
QDomElement root = doc.createElement( "kdevelop" );
doc.appendChild( root );
QDomElement general = doc.createElement( "general" );
root.appendChild( general );
element = doc.createElement( "author" );
text = doc.createTextNode( "zeki" );
element.appendChild( text );
general.appendChild( element );
element = doc.createElement( "email" );
text = doc.createTextNode( "caizhiming@tom.com" );
element.appendChild( text );
general.appendChild( element );
element = doc.createElement( "version" );
text = doc.createTextNode( "$VERSION" );
element.appendChild( text );
general.appendChild( element );
QDomElement keywords = doc.createElement( "keywords" );
element = doc.createElement( "keyword" );
text = doc.createTextNode( "C++" );
element.appendChild( text );
keywords.appendChild( element );
general.appendChild( keywords );
element = doc.createElement( "ignoreparts" );
general.appendChild( element );
QDomElement kdevfileview = doc.createElement( "kdevfileview" );
QDomElement groups = doc.createElement( "groups" );
element = doc.createElement( "group" );
QDomAttr pattern = doc.createAttribute( "pattern" );
pattern.setValue( "*.cpp;*.cxx;*.h" );
QDomAttr name = doc.createAttribute( "name" );
name.setValue( "Sources" );
element.setAttributeNode( pattern );
element.setAttributeNode( name );
groups.appendChild( element );
kdevfileview.appendChild( groups );
root.appendChild( kdevfileview );
QTextStream out( &file );
doc.save( out, 4 );
return 0;
}
实例二使用DOM方法解析上面生成的XML文件:
int main(int argc, char *argv[])
{
QDomDocument doc( "kdevelop" );
QFile file( "domwrite.kdevelop" );
if ( !file.open( QIODevice::ReadOnly ) )
return 0;
if ( !doc.setContent( &file ) )
{
file.close();
return 0;
}
file.close();
QDomElement root = doc.documentElement();
QDomElement child = doc.firstChildElement().firstChildElement();
while ( !child.isNull() )
{
QString sTagName = child.tagName();
if ( sTagName == "general" )
{
QDomElement element = child.firstChildElement();
while ( !element.isNull() )
{
if ( element.tagName() == "author" )
{
QString author = element.text();
}
else if ( element.tagName() == "email" )
{
QString email = element.text();
}
else if ( element.tagName() == "version" )
{
QString version = element.text();
}
else if ( element.tagName() == "keywords" )
{
QDomElement keyword = element.firstChildElement();
if ( keyword.tagName() == "keyword" )
{
QString sWord = keyword.text();
}
}
element = element.nextSiblingElement();
}
}
else if ( sTagName == "kdevfileview" )
{
QDomElement element = child.firstChildElement().firstChildElement();
QString pattern = element.attribute( "pattern" );
QString name = element.attribute( "name" );
}
child = child.nextSiblingElement();
}
return 0;
}
Qt之XML(一) DOM的更多相关文章
- QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写 ...
- Qt之xml文件解析
XML文件简介 XML - EXtensible Markup Language,可拓展标记语言 Qt中加载XML模块 .pro 文件中添加 QT += xml Qt的XML访问方式 引用:https ...
- Java知识积累-XML的DOM解析修改和删除方法
import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;import jav ...
- 用java操作XML文件(DOM解析方式)
XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...
- xml语法、DTD约束xml、Schema约束xml、DOM解析xml
今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...
- 使用jaxp对比xml进行DOM解析
/*DOM解析编程 •遍历所有节点 •查找某一个节点 •删除结点 •更新结点 •添加节点 /* package cn.itcast.jaxp; import java.io.File; import ...
- Java XML DOM解析范例源码
下边内容内容是关于Java XML DOM解析范例的内容.import java.io.InputStream; import java.util.ArrayList; import java.uti ...
- mybatis源码-解析配置文件(一)之XML的DOM解析方式
目录 简介 Java 中 XML 文件解析 解析方式 DOM 解析 XML 新建 XML 文件 DOM 操作相关类 Java 读取 XML 文件 一起学 mybatis @ 简介 在之前的文章< ...
- python parse xml using DOM
demo: import xml.dom.minidom dom=xml.dom.minidom.parse('sample.xml')root = dom.documentElementcc=dom ...
随机推荐
- python【第十六篇】DOM
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口. DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构.换句 ...
- java 转html为pdf
最近有个需求转html为pdf . 用过itext . pd4ml ,都不理想,不是样式有问题,就是页面大小有问题. 或字体有问题. 解决办法是通过wkhtmltopdf工具 , 下载地址为:htt ...
- init_sequence所对应的函数
一.init_sequence内容 init_fnc_t *init_sequence[] = { cpu_init, /* basic cpu dependent setup */ board_in ...
- 学习总结之Log4NET
通过在网上查找了一些资料,用了些时间学习了log4NET,做了一个小小的总结,说一下它的特点吧 首先呢log4NET是.Net下一个非常优秀的开源日志记录组件.它可以将日志分成不同等级,也可以按照我们 ...
- EF自动生成的(T4模板) 关联属性元数据修改
为了实现 T4模板关联属性 不要序列化的问题 就是要在具体的 关联属性上面添加一个元数据 这里利用以前的 Newtonsoft.Json 这个框架为例 效果应该为 就是要在关联属性上面添加元数据 [ ...
- CodeChef CBAL
题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...
- MVC OR API的接口
MVC OR WEBAPI的接口安全 当我们开发一款App的时候,App需要跟后台服务进行通信获取或者提交数据.如果我们没有完善的安全机制则很容易被别用心的人伪造请求而篡改数据.所以我们需要使用某种安 ...
- 百度云推送 pem
1. p12证书导出 在钥匙串访问中选中推送证书,导出为个人信息交换文件(.p12格式). 选择文件格式.文件名和保存路径. 输入导出密码. 2. pem证书生成 将p12证书文件转换成pem证书文件 ...
- 简谈HashMap、HashTable的区别
简单的说HashMap是HashTable的轻量级实现,即非线程安全的实现,他们的主要区别概述为: HashMap HashTable (1)允许键和值为null 不允许键或值为null (2)不是 ...
- 【UVA11324】The Largest Clique (SCC)
题意: 给一张有向图G,求一个结点数最大的结点集,使得该结点中任意两个结点 u 和 v满足:要么 u 可以到达 v, 要么 v 可以到达 u(u 和 v 相互可达也可以). 分析: Tarjan求SC ...