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. It Started With A Kiss

  2. Java基础9一面向对象

    继承 1.特点 a) 要有一定的层次结构,并且具备可传递性. b) 判断两者之间是否有继承关系通过is-a来判断. c) 子类继承了父类,那么子类就继承了父类中所有的属性和方法,但是父类中的私有属性和 ...

  3. win7利用tsmmc.msc远程管理工具

    win7和xp默认不带tsmmc.msc远程管理工具.我们只需要从2003的windows\system32目录下复制 mstsmhst.dll ,mstsmmc.dll 和tsmmc.msc文件放到 ...

  4. Wireshark抓包过滤

    主要说明下抓包前准备工作,及wireshark里面的两个过滤器:捕获过滤器和应用显示过滤器 1.捕获过滤器.顾名思义就是捕获时的过滤器.主要用来决定你要抓包抓哪个IP哪个端口,明确自己要抓哪个IP和端 ...

  5. 异常及String

    异常时描述错误信息的对象,在编码过程中我们会遇到很多异常 例如: 1.java.lang.ArithmeticException 算数异常.算数运算出现错误时抛出 比如用0做除数 2.java.lan ...

  6. Qt5—嵌入停靠窗口QDockWidget

    参考链接:http://blog.csdn.net/summer_xiyer/article/details/12875899 新建一个GUI工程: QDockWidget是QWidget的子类,也等 ...

  7. Juery实现选项卡

    选项卡是一种很常用的组件.比如3个选项的选项卡,比较笨的一种办法是,把3个状态写成3个独立页面,互相链接.这样做的问题也显而易见,切换的时候url会变.如果是手机端网页,加载慢一点,给人的感觉是不断的 ...

  8. type="radio"样式修改

    input[type=radio],input[type=checkbox] { display: inline-block; vertical-align: middle; width: 20px; ...

  9. Javascript中的null和 undefined

    Javascript Undefined vs NULL Many a times we often get confused on whats the difference between UNDE ...

  10. 小结ajax中的同源和跨域 jsonp和cors

    网上的同源和跨域一般都比较复杂,最近也稍微总结了一下: 所谓同源,是浏览器的一种安全机制,作用在于保护网页数据的安全,不同源的网页之间不允许cookie dom ajax等行为 同源的条件:1.协议相 ...