QtXML(一)

文档名称

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的更多相关文章

  1. QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写   ...

  2. Qt之xml文件解析

    XML文件简介 XML - EXtensible Markup Language,可拓展标记语言 Qt中加载XML模块 .pro 文件中添加 QT += xml Qt的XML访问方式 引用:https ...

  3. Java知识积累-XML的DOM解析修改和删除方法

    import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;import jav ...

  4. 用java操作XML文件(DOM解析方式)

    XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...

  5. 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 ...

  6. 使用jaxp对比xml进行DOM解析

    /*DOM解析编程 •遍历所有节点 •查找某一个节点 •删除结点 •更新结点 •添加节点 /* package cn.itcast.jaxp; import java.io.File; import ...

  7. Java XML DOM解析范例源码

    下边内容内容是关于Java XML DOM解析范例的内容.import java.io.InputStream; import java.util.ArrayList; import java.uti ...

  8. mybatis源码-解析配置文件(一)之XML的DOM解析方式

    目录 简介 Java 中 XML 文件解析 解析方式 DOM 解析 XML 新建 XML 文件 DOM 操作相关类 Java 读取 XML 文件 一起学 mybatis @ 简介 在之前的文章< ...

  9. python parse xml using DOM

    demo: import xml.dom.minidom dom=xml.dom.minidom.parse('sample.xml')root = dom.documentElementcc=dom ...

随机推荐

  1. Android新建项目 默认布局改为 LinearLayout

    目前此方法仅适用于eclipse 需要修改SDK 目录 android-sdk/tools/templates/activities/BlankActivity/root/res/layout 文件: ...

  2. oracle 自动增长

    在SQLSERVER和MYSQL里面自动增长字段直接设置就可以.在ORACLE里面就复杂多了.特别是我这样的初学者,不过网络是最好的老师,看了很多相关介绍,本人使用的是使用触发器.具体如下: 首先要创 ...

  3. net Core 通过 Ef Core 访问、管理Mysql

    net Core 通过 Ef Core 访问.管理Mysql 本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1. ...

  4. jquery 滑动动画

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <head> ...

  5. iOS:NAV+TABLE结合

    功能:点击列表项,用列表字符串作为参数创建一个新视图,新视图默认可以有一个BACK按钮回到上一个视图 // // main.m // Hello // // Created by lishujun o ...

  6. Android系统的体系结构、开发语言及源码结构

    整理自android系统体系结构 Android 是google公司针对手机开发的一个平台,并公布了其中大部分代码,其大部分应用程序都是用JAVA开发的,毕竟它是商业性的产品嘛,有所保留也是理所 当然 ...

  7. 转-[Python 学习]2.5版yield之学习心得

    在 shhgs 发布了关于< Py 2.5 what’s new 之 yield>之后,原来我不是特别关注 yield 的用法,因为对于2.3中加入的yield相对来说功能简单,它是作为一 ...

  8. Linux硬链接与软连接

    1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节 ...

  9. 重构第三天:提升方法&下移方法

    如果两个子类拥有相同的方法,把它们移动到超类中来 Warning! 但是从子类到父类移动方法的时候要注意, 不要过度采用这种方法,否则会出现继承滥用的情况.如果一个父类A有多个方法,假设m1, m2方 ...

  10. QQ游戏百万人同时在线服务器架构实现

    转载自:http://morton5555.blog.163.com/blog/static/976407162012013112545710/# QQ游戏于前几日终于突破了百万人同时在线的关口,向着 ...