main.cpp

 #include <QtGui>
#include <iostream> #include "saxhandler.h" int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDir::setCurrent(app.applicationDirPath());//设置路径为当前目录 QStringList labels;
labels << QObject::tr("Terms") << QObject::tr("Pages"); QTreeWidget treeWidget;
treeWidget.setHeaderLabels(labels);
treeWidget.header()->setResizeMode(QHeaderView::Stretch);
treeWidget.setWindowTitle(QObject::tr("SAX Handler"));
treeWidget.show(); SaxHandler handler(&treeWidget);
handler.readFile("in1.xml"); return app.exec();
}

saxhandler.h

#ifndef SAXHANDLER_H
#define SAXHANDLER_H #include <QXmlDefaultHandler> class QTreeWidget;
class QTreeWidgetItem; class SaxHandler : public QXmlDefaultHandler
{
public:
SaxHandler(QTreeWidget *tree); bool readFile(const QString &fileName); protected:
bool startElement(const QString &namespaceURI,
const QString &localName,
const QString &qName,
const QXmlAttributes &attributes);
bool endElement(const QString &namespaceURI,
const QString &localName,
const QString &qName);
bool characters(const QString &str);
bool fatalError(const QXmlParseException &exception); private:
//树控件窗口
QTreeWidget *treeWidget;
//树控件项
QTreeWidgetItem *currentItem;
QString currentText;
}; #endif

saxhandler.cpp

 #include <QtGui>
#include <iostream> #include "saxhandler.h" SaxHandler::SaxHandler(QTreeWidget *tree)
{
treeWidget = tree;
} //接受用存储在XML文件中的信息进行组装的QTreeWidget
//要获得要解析文件的文件名时,会调用这个函数.
bool SaxHandler::readFile(const QString &fileName)
{
currentItem = ; QFile file(fileName);
//用来读取文件
QXmlInputSource inputSource(&file);
//用来解析这个文件
QXmlSimpleReader reader;
reader.setContentHandler(this);
reader.setErrorHandler(this);
//调用pause来进行解析
return reader.parse(inputSource);
} //当阅读器遇到一个新的打开标签时,就会调用startElement()函数.
//第三个参数是标签的名称,第四个参数是属性列表.
bool SaxHandler::startElement(const QString & /* namespaceURI */,
const QString & /* localName */,
const QString &qName,
const QXmlAttributes &attributes)
{
//如果是<entry>
if (qName == "entry") {
//创建一个新的QTreeWidgetItem项,如果currentItem存在则以此为
//父对象,如果不存在则以treeWidget根为父对象
currentItem = new QTreeWidgetItem(currentItem ?
currentItem : treeWidget->invisibleRootItem());
//设置文本
currentItem->setText(, attributes.value("term"));
}
else if (qName == "page")
{
//currentText是一个累加器,用于处理<page>之间的文本
currentText.clear();
}
return true;
} //可以把字符数据添加到currentText变量中,当遇到字符数据时进行操作
bool SaxHandler::characters(const QString &str)
{
currentText += str;
return true;
} //当遇到一个关闭标签会调用endElement.第三个参数是标签的名称.
bool SaxHandler::endElement(const QString & /* namespaceURI */,
const QString & /* localName */,
const QString &qName)
{
//如果是</entry>则更新currentItem私有变量
//使它指向当前QTreeWidgetItem的父对象
if (qName == "entry") {
currentItem = currentItem->parent();
}
//如果为</page>,则把指定的页码或者范围添加到这一列当前项的文本
else if (qName == "page")
{
if (currentItem)
{
QString allPages = currentItem->text();
if (!allPages.isEmpty())
allPages += ", ";
allPages += currentText;
currentItem->setText(, allPages);
}
}
return true;
} //解析失败会调用fatalError函数,给出行号,列号,以及这个解析器的错误文本
bool SaxHandler::fatalError(const QXmlParseException &exception)
{
std::cerr << "Parse error at line " << exception.lineNumber()
<< ", " << "column " << exception.columnNumber() << ": "
<< qPrintable(exception.message()) << std::endl;
return false;
}

41.使用SAX读取XML的更多相关文章

  1. 17.JAVA-Dom、Sax解析XML详解

    在JAVA中,解析有三种方式: Dom解析(支持改删,耗内存). Sax解析(不支持改删,不耗内存). Pull解析(在Android中推荐使用的一种解析XML的方式,在下章学习). 1.支持Dom与 ...

  2. java读取xml文件报“org.xml.sax.SAXParseException: Premature end of file” .

    背景:java读取xml文件,xml文件内容只有“<?xml version="1.0" encoding="UTF-8"?>”一行 java读取该 ...

  3. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

  4. 利用SAX解析读取XML文件

    xml     这是我的第一个BLOG,今天在看<J2EE应用开发详解>一书,书中讲到XML编程,于是就按照书中的步骤自己测试了起来,可是怎么测试都不成功,后来自己查看了一遍源码,发现在读 ...

  5. PHP读取XML

    books.xml文件: 代码 <books> <book> <author>Jack Herrington</author> <title> ...

  6. C++读取XML,tinyXml的使用

    前言: 最近在开发的过程中,有个需求是对xml进行格式转化,从一种格式转化到另外一种格式.因此,就需要读取xml进行处理.原本打算写成工具在linux下运行,不过后来考虑到和系统结合,最后也就使用了前 ...

  7. 利用freemarker+SAX解析xml的方式对excel文件字段校验

    利用freemarker对参数进行校验这篇文章主要用到的技术点: 自定义注解的使用反射机制SAX解析xmlFreemarker的运用我们在工作中经常需要上传excel文件,然后在对文件中的字段进行校验 ...

  8. java读取 xml文件

    java读取xml文件的四种方法  转自https://www.cnblogs.com/lingyao/p/5708929.html Xml代码 1 <?xml version="1. ...

  9. Android 使用pull,sax解析xml

    pull解析xml文件 1.获得XmlpullParser类的引用 这里有两种方法 //解析器工厂 XmlPullParserFactory factory=XmlPullParserFactory. ...

随机推荐

  1. 使用Micrisoft.net设计方案 第三章Web表示模式

    第三章Web表示模式 体系结构设计者在设计第一个作品时比较精简和干练.在第一次设计时,并清除自己做什么,因此比较小心谨慎.第二个作品是最危险的一个作品,此时他会对第一个作品做修饰和润色,以及把第一次设 ...

  2. Codeforces Round #450

    Find Extra One Solution Position in Fraction Solution Remove Extra One f[i]表示删掉i能增加的record数目 从左到右处理, ...

  3. 5) 十分钟学会android--ActionBar知识串烧

    建立ActionBar Action bar 最基本的形式,就是为 Activity 显示标题,并且在标题左边显示一个 app icon.即使在这样简单的形式下,action bar对于所有的 act ...

  4. 工厂模式-CaffeNet训练

    参考链接:http://blog.csdn.net/lingerlanlan/article/details/32329761 RNN神经网络:http://nbviewer.ipython.org/ ...

  5. git基础讲解

    idea :https://blog.csdn.net/autfish/article/details/52513465 eclipse:https://blog.csdn.net/yang57266 ...

  6. vc++如何创建程序-构造和继承

    #include<iostream.h>//定义一个动物类class Animal{public: void eat();//添加方法 { cout<<"animal ...

  7. java equals的用法

    equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较.Object类中的equals方法内部使用的就是==比较运算符. package Xuexi; public cla ...

  8. Fiddler4抓包工具使用教程

    本文参考自http://blog.csdn.net/ohmygirl/article/details/17846199,纯属读书笔记,加深记忆 1.抓包工具有很多,为什么要使用Fiddler呢?原因如 ...

  9. WEBGL学习【二】平面图形

    <html lang="zh-CN"> <head> <title>NeHe's WebGL</title> <meta ch ...

  10. HDU2035 - 人见人爱A^B

    求A^B的最后三位数表示的整数.  说明:A^B的含义是"A的B次方" Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=1 ...