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 ...
随机推荐
- vs报错找不到错在哪里!Validation failed for one or more entities
今天在处理Entity Framework修改数据库时,报错: Validation failed for one or more entities. See 'EntityValidationErr ...
- urlencode rawurlencode htmlspecialchars htmlentities
w string urlencode ( string $str ) 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+).此 ...
- FW ImageMagick
ExploitFixes ImageMagick < 6.9.3-9 - Multiple Vulnerabilities 2016-05-04 22:05:53 Nikolay Ermishk ...
- window子对象
Window 子对象 (1)Location 对象 Location 对象包含有关当前 URL(统一资源定位符) 的信息.(Uniform Resource Location) Location 对象 ...
- unknown facet type would you like to ignore facet from module
去idea plugin 里面把红色的插件 重新勾选一下,点apply 重启就可以了
- 【JDBC】java程序通过jdbc连接oracle数据库方法
版权声明:本文为博主原创文章(原文:blog.csdn.net/clark_xu 徐长亮的专栏).未经博主同意不得转载. https://blog.csdn.net/u011538954/articl ...
- Dubbo学习和配置(转载)
转载自: 简单了解下Dubbo 1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架, ...
- shuit模块
shuit模块 #高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中,可以部分内容 def copyf ...
- id函数
描述 id() 函数用于获取对象的内存地址. 语法 id 语法: id([object]) 参数说明: object -- 对象. 返回值 返回对象的内存地址. 实例 以下实例展示了 id 的使用方法 ...
- LeetCode:学生的出勤记录|【551】
LeetCode:学生的出勤记录|[551] 题目描述 给定一个字符串来代表一个学生的出勤纪录,这个纪录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : P ...