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 ...
随机推荐
- Android UI开发第二十八篇——Fragment中使用左右滑动菜单
Fragment实现了Android UI的分片管理,尤其在平板开发中,好处多多.这一篇将借助Android UI开发第二十六篇——Fragment间的通信. Android UI开发第二十七篇——实 ...
- Java多线程同步锁的理解
java主要通过synchronized的关键字来实现的.让我们从一个买票程序说起吧. package com.day04; /** * * @author Administrator 问题描述:使用 ...
- 巨蟒python全栈开发django10:ajax&&登录认证
通过题目进行知识点回顾: 聚合查询 From django.db.models import Avg,Min,Max,F,Q,Count,Sum #查询书籍的平均值 Ret= Models.Book. ...
- 关于User的一些注解
@RequiresAuthentication 验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时. @RequiresUser 验证用户是否被记忆,us ...
- 数据库垂直拆分,水平拆分利器,cobar升级版mycat(转)
原文:数据库垂直拆分,水平拆分利器,cobar升级版mycat 1,关于Mycat Mycat情报 基于阿里的开源cobar ,可以用于生产系统中,目前在做如下的一些改进: 非阻塞IO的实现,相对于目 ...
- 解读mysql主从配置及其原理分析(Master-Slave)
在windows下配置的,后面会在Linux下配置进行测试,需要配置mysql数据库同步的朋友可以参考下. 1.在主数据库服务器为从服务器添加一个拥有权限访问主库的用户:GRANT REPLICATI ...
- ALE和IDocs
转自:http://blog.163.com/shenshengqge@126/blog/static/820512902011101152518635/ 作为目前ERP市场上最为领先的应用系统之一, ...
- Python2 socket TCPServer 多线程并发 超时关闭
在阿里云上测试过,可以直接使用. 用IP和端口发送数据,会返回echo:+接收到的数据 #coding=utf-8 import socket import threading,getopt,sys, ...
- django路由系统之反向生成url
from niubin.service import v1 from django.urls import reverse from django.shortcuts import HttpRespo ...
- 当退出python时,是否释放全部内存
答案是no,循环引用其他对象或引用自全局命名空间的对象的模块,在python退出时并非完全释放 另外,也不会释放c库保留的内存部分