Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11371
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 23
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-13 18:00
个人简介

非淡泊无以明志,非宁静无以致远。

文章分类

全部博文(4)

最近访客

分类: C/C++

2016-01-29 18:06:02

原文地址:Qt之XML(一) 作者:baifengxian

QtXML(一)

文档名称

QtXML

创建时间

2012-10-10

修改时间

2012-10-10

创建人

Baifx

简介(收获)

 

 最近开始使用QtXml,学习了一番,写了几个小测试程序。

        QtXML模块支持流行的两种XML解析方法,DOMSAX。两种方法各有优缺点,DOM方法将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些。SAX是一种事件驱动的XML API,速度快,但不便于随机访问任意节点。通常根据实际应用选用合适的解析方法。在Qt4.3中还引入了一种基于流的XML解析方法。

 

       DOM

       DOM(文件对象模型,Document Object Model)是W3C开发的独立于平台和语言的接口,它可以使程序和脚本能够动态地存取和更新XML文档的内容、结构和风格。DOMLevel123三个级别的规范。Qt支持DOM Level2规范。

       DOM在内存中将XML文件表示为一棵树,用户通过API可以随意地访问树的任意节点内容。在Qt中,XML文档自身使用QDomDocument表示,所有的节点类都从QDomNode继承。其继承关系如下图所示:

 

 

 

       QDomDocument::setContent()完成XML文档的设置,他从QFile对象中读取XML数据并检测XML文档的编码。setContent()有几种重载形式,可以分别从QByteArrayQStringQIODeviceQXmlInputSource中读取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;

}

阅读(921) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:堆、栈、堆栈的区别

给主人留下些什么吧!~~