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 ...
随机推荐
- SQL Server函数
阅读目录 SQL Server函数---Union与Union All的区别 回到顶部 SQL Server函数---Union与Union All的区别 如果我们需要将两个select语句的结果作为 ...
- 超哥mysql数据库部分blog整理:
总目录:mysql数据库阶段学习目录 https://www.cnblogs.com/clschao/articles/10065275.html Day1. 1.数据库初识 https://www. ...
- window 注册表上下文菜单如何配置?
注册表结构? Keys Abbreviation Description 描述 HKEY_CLASSES_ROOT HKCR Stores file association and COM objec ...
- java中参数传递的问题
public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer(" ...
- windows server2003/2008中权限账户
在windows server 2003与windows server 2008 R2中,查看文件夹权限时,尤其是用cacls命令查看时,经常会见nt authority system这样的用户信息. ...
- 高斯过程(GP)
随机过程基本概念: 随机过程是一个比随机变量更广泛的概念.在概率论中,通常研究一个或多个这样有限个数的随机变量,即使在大数定律和中心极限定理中考虑了无穷多个随机变量,但也要假设随机变量之间互相独立.而 ...
- android学习一---搭建开发环境
android基于Java并运行Linux内核上的轻量级操作系统.由于是基于java的,学习起来也不是太难,对java有一定了解并知道一些基本的图形用户界面,入门就很简单了. 一.了解JDK ,SDK ...
- JavaWeb—拦截器Interceptor
1.概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取A ...
- vue+django前后端分析解决csrf token问题
vue-resource post数据 参考:https://www.cnblogs.com/linxizhifeng/p/8995077.html 阅读django CsrfViewMiddlewa ...
- 解决问题知识点--mysql数据库
一: 连接 多表的字段中含null的 多表查询 ----左右连接查询! 例: 一张 emp(emano,ename,sal,deptno) 雇员表, 一张 dept(deptno,dname) 部 ...