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 三种解析方法 简单示例的更多相关文章

  1. 解析XML文档之三:使用DOM解析

    dom解析方法是将整个xml文档装载到内存当中,然后通过树形结构方式去解析的,这种方式只适合于在pc端的开发,不是很适合手机端的开发,毕竟来说手机的内存是没法跟pc相提并论的. 具体实现步骤如下: 第 ...

  2. Struts.xml中Action的method与路径的三种匹配方法

    原文  http://blog.csdn.net/woshixuye/article/details/7734482 首先我们有一个Action——UserAction public class Us ...

  3. 文档对象模型操作xml文档

    简介 :文档对象模型(DOM)是一种用于处理xml文档的API函数集. 2.1文档对象模型概述 按照W3C的定义,DOM是“一种允许程序或脚本动态地访问更新文档内容,结构和样式的.独立于平台和语言的规 ...

  4. Java解析XML文档(简单实例)——dom解析xml

      一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...

  5. Java解析XML文档——dom解析xml

    一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object M ...

  6. 精讲 org.w3c.dom(java dom)解析XML文档

    org.w3c.dom(java dom)解析XML文档 位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会 ...

  7. JavaEE实战——XML文档DOM、SAX、STAX解析方式详解

    原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...

  8. iOS网络编程笔记——XML文档解析

    今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...

  9. XML文档读取-DOM

    DOM(Document Object Model),“文档对象模型”早期是为了解决不用浏览器间数据兼容问题提出的解决方案,现在已经是W3C组织推荐的处理可扩展标志语言的标准编程接口. W3C DOM ...

随机推荐

  1. codevs1068 乌龟棋==洛谷P1541 乌龟棋

    P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家 ...

  2. EasyNVR摄像机无插件直播进行摄像机云台控制的接入及调用详解

    EasyNVR云台接入及控制详解 摄像机云台控制在摄像机当中很常见摄像机能将当前状态下云台的水平角度.倾斜角度和摄像机镜头焦距等位置参数存储到设备中,需要时可以迅速调用这些参数并将云台和摄像头调整至该 ...

  3. 海康、大华NVR网络硬盘录像机录像无插件全平台访问实现—录像回放时间轴功能实现方法

    在之前的博文中我们有介绍方案*NVR硬件录像机web无插件播放方案(支持取特定时间段视频流)*:该片博文旨在介绍时间轴功能的实现和相关接口的调用: 时间轴样式展示: 问题分析 对于 时间轴的展示实现需 ...

  4. 关于Springboot中dubbo整合注意的误区(不对之处请指出)

    这是我的客户端配置! 这是生产的配置, 首先注意一下 scan   我之前尝试这样的客户端配置 然后  果断客户端不能注册接口 @Reference(version="1.0") ...

  5. 让linux进程后台运行、会话断开不退出

    方法一:nohup ping www.ibm.com & 可改变进程的父进程号方法二:setsid ping www.ibm.com 可改变进程的父进程号方法三:(ping www.ibm.c ...

  6. Cassandra代替Redis?(转)

    原文:Cassandra代替Redis? 最近用Cassandra的又逐渐多了,除了之前的360案例,在月初的QCon Shanghai 2013 篱笆网也介绍了其使用案例.而这篇百万用户时尚分享网站 ...

  7. boost之正则表达式

    正则表示主要用于查找一系列符合规则的对象,而我们之前的查找是对某一特定的字符串进行查找. #include <iostream> #include <vector> #incl ...

  8. LeetCode:为运算表达式设置优先级【241】

    LeetCode:为运算表达式设置优先级[241] 题目描述 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含  ...

  9. iOS 视频全屏功能 学习

    项目中,也写过类似"视频全屏"的功能, 前一阵子读到今日头条 的一篇技术文章,详细介绍三种旋转方法差异优劣最终择取.文章从技术角度看写的非常好,从用户角度看,也用过多家有视频功能的 ...

  10. 每天一个Linux命令(40)vmstat命令

          vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控. 它能够对系统的整体情况进行统计,无法对某个进程 ...