QT XML文档的解析 QXmlStreamReader, DOM,SAX 三种解析方法 简单示例
0. xml文档如下
<?xml version="1.0"?>
<bookindex>
<entry term="sidebearings">
<page>10</page>
<page>34-35</page>
<page>307-308</page>
</entry>
<entry term="subtraction">
<entry term="of pictures">
<page>115</page>
<page>244</page>
</entry>
<entry term="of vectors">
<page>9</page>
</entry>
</entry>
</bookindex>
1. 用QXmlStreamReader 解析
使用QT时需要添加xml模块, 修改工程文件.pro,QT+=xml
//#include "widget.h"
#include <QApplication>
#include <QtGui>
#include <qxmlstream.h>
#include <iostream>
#include <QDebug> QXmlStreamReader reader;
bool readFile(const QString &fileName);
void readBookindexElement(); //解析含有0或以上<entry>元素的 <bookindex> ... </bookindex>
void readEntryElement(); //解析含有0或以上<page>元素的<entry> ... </entry>
void skipUnknowElement(); //跳过不认识的元素
void readPageElement(); //解析一个<page> ... </page> 元素 bool readFile(const QString &fileName)
{
QFile file(fileName);
if( !file.open(QFile::ReadOnly | QFile::Text) )
{
std::cerr << "Error: Cannot read file" << qPrintable(fileName)
<< ": " << qPrintable(file.errorString()) << std::endl;
return false;
} reader.setDevice(&file);
reader.readNext();
while( !reader.atEnd() )
{
if( reader.isStartElement() )
{
qDebug() << "reader.name: " << reader.name();
if( reader.name() == "bookindex" )
{
qDebug() << "start element: bookindex";
readBookindexElement();
break;
}
else
{
qDebug() << "not a right start element";
reader.raiseError(QObject::tr("not a right start element"));
}
}
else
reader.readNext();
}
file.close();
} void readBookindexElement()
{
reader.readNext();
while( !reader.atEnd() )
{
if(reader.isEndElement())
{
reader.readNext();
break;
} if(reader.isStartElement())
{
if( reader.name() == "entry" )
{
readEntryElement();
}
else
skipUnknowElement();
}
else
reader.readNext();
}
} void readEntryElement()
{
//qDebug() << "readEntryElement";
reader.readNext();
while(!reader.atEnd())
{
if(reader.isEndElement())
{
reader.readNext();
break;
} if(reader.isStartElement())
{
if( reader.name() == "entry" )
readEntryElement();
else if( reader.name() == "page" )
readPageElement();
else
skipUnknowElement();
}
else
reader.readNext();
}
} void skipUnknowElement()
{
//qDebug() << "skipUnknowElement";
reader.readNext();
while(!reader.atEnd())
{
if( reader.isEndElement() )
{
reader.readNext();
break;
} if(reader.isStartElement())
skipUnknowElement();
else
reader.readNext();
}
} void readPageElement()
{
//qDebug() << "readPageElement";
QString page = reader.readElementText();
if( reader.isEndElement() )
reader.readNext();
qDebug() << "page: " << page;
} int main(int argc, char *argv[])
{
readFile("77.xml"); return 0;
}
2. 用DOM方式解析
使用QT时需要添加xml模块, 修改工程文件.pro,QT+=xml
#include "widget.h"
#include <QApplication>
#include <QtGui>
#include <QDomElement>
#include <QDebug>
#include <iostream> bool readFile(const QString &fileName);
void parseBookindexElement(const QDomElement &element);
void parseEntryElement(const QDomElement &element);
void parsePageElement(const QDomElement &element); bool readFile(const QString &fileName)
{
//qDebug() << "readFile";
QFile file(fileName);
if( !file.open(QFile::ReadOnly | QFile::Text) )
{
std::cerr << "Error: cannot read file" << qPrintable(fileName)
<<": " << qPrintable(file.errorString()) << std::endl;
return false;
} QString errorStr;
int errorLine;
int errorColumn; QDomDocument doc;
if( !doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn) )
{
std::cerr << "Error: Parse error at line " << errorLine <<","
<< "column " << errorColumn << ","
<< qPrintable(errorStr) << std::endl;
return false;
} QDomElement root = doc.documentElement();
if( root.tagName() != "bookindex" )
{
std::cerr << "Error: root element is not right" << std::endl;
return false;
}
parseBookindexElement(root);
return true; } void parseBookindexElement(const QDomElement &element)
{
//qDebug() << "parseBookindexElement";
QDomNode child = element.firstChild();
while(!child.isNull())
{
if( child.toElement().tagName() == "entry" )
parseEntryElement(child.toElement());
child = child.nextSibling();
}
} void parseEntryElement(const QDomElement &element)
{
//qDebug() << "parseEntryElement";
QDomNode child = element.firstChild();
while(!child.isNull())
{
if( child.toElement().tagName() == "entry" )
parseEntryElement(child.toElement());
else if( child.toElement().tagName() == "page" )
parsePageElement(child.toElement()); child = child.nextSibling();
}
} void parsePageElement(const QDomElement &element)
{
//qDebug() << "parsePageElement";
QString page = element.text();
qDebug() << "page: " << page;
} int main(int argc, char *argv[])
{
readFile("77.xml"); return 0;
}
QT XML文档的解析 QXmlStreamReader, DOM,SAX 三种解析方法 简单示例的更多相关文章
- 解析XML文档之三:使用DOM解析
dom解析方法是将整个xml文档装载到内存当中,然后通过树形结构方式去解析的,这种方式只适合于在pc端的开发,不是很适合手机端的开发,毕竟来说手机的内存是没法跟pc相提并论的. 具体实现步骤如下: 第 ...
- Struts.xml中Action的method与路径的三种匹配方法
原文 http://blog.csdn.net/woshixuye/article/details/7734482 首先我们有一个Action——UserAction public class Us ...
- 文档对象模型操作xml文档
简介 :文档对象模型(DOM)是一种用于处理xml文档的API函数集. 2.1文档对象模型概述 按照W3C的定义,DOM是“一种允许程序或脚本动态地访问更新文档内容,结构和样式的.独立于平台和语言的规 ...
- Java解析XML文档(简单实例)——dom解析xml
一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...
- Java解析XML文档——dom解析xml
一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object M ...
- 精讲 org.w3c.dom(java dom)解析XML文档
org.w3c.dom(java dom)解析XML文档 位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会 ...
- JavaEE实战——XML文档DOM、SAX、STAX解析方式详解
原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...
- iOS网络编程笔记——XML文档解析
今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...
- XML文档读取-DOM
DOM(Document Object Model),“文档对象模型”早期是为了解决不用浏览器间数据兼容问题提出的解决方案,现在已经是W3C组织推荐的处理可扩展标志语言的标准编程接口. W3C DOM ...
随机推荐
- HTML学习笔记——常用元素及其属性(一)
1.img 标签 -- 代表HTML图像 img标签是单独出现的,<img /> 语法: <img src="URI" alt="alttext&quo ...
- 1052 最大M子段和(DP)
1052 最大M子段和 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个 ...
- B - Catch That Cow (抓牛)
B - Catch That Cow Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- MySql 安装常见问题汇总
说明: 以下是针对 Mac 10.11 系统 以前,安装 MySql 数据库后, 设置的密码过于复杂,想更改为简单的密码, 方便数据库的使用. 1. 关闭和启动 MySql 数据库的方法: Syste ...
- QSystemSemaphore 系统级信号量
在之前的一篇文章中,我们讲过了QSemaphore类,其可以用于同步多线程.而今天要讲到的这个类,根据名字就可以猜测到,其可以在整个系统中使用,即它既可以用于多线程,也可以用于多线程.当然,这也意味着 ...
- 【题解】Digit Tree
[题解]Digit Tree CodeForces - 716E 呵呵以为是数据结构题然后是淀粉质还行... 题目就是给你一颗有边权的树,问你有多少路径,把路径上的数字顺次写出来,是\(m\)的倍数. ...
- 002-maven修改仓库以及镜像地址
1.将下载好的maven,修改配置 <localRepository>G:\mavenrepository-idea</localRepository> 2.修改增加镜像地址 ...
- 解决svnserve: Can't bind server socket: Address already in use
最近在忙着搭建jenkins系统集成版本控制和git分布式版本控制,其中涉及到了点svn方面的,由于自己也是第一次搭建svn,挺顺利的,中间遇到点小问题: 我使用的是yum安装的svn,安装完成配置结 ...
- NetCDF 介绍
NetCDF 1 NetCDF 1.1概述(Overview) NetCDF (network Common Data Form) is a set of software libraries and ...
- 实现对第三方应用任意SO注入
实现对第三方应用任意SO注入 0x01 应用在Android中运行,从外部对该进程可以进行任意SO文件动态注入,就是应用动态运行我们的SO文件 0x02 基本的逻辑是: 1. 获取目标进程的pi ...