41.使用SAX读取XML
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的更多相关文章
- 17.JAVA-Dom、Sax解析XML详解
在JAVA中,解析有三种方式: Dom解析(支持改删,耗内存). Sax解析(不支持改删,不耗内存). Pull解析(在Android中推荐使用的一种解析XML的方式,在下章学习). 1.支持Dom与 ...
- java读取xml文件报“org.xml.sax.SAXParseException: Premature end of file” .
背景:java读取xml文件,xml文件内容只有“<?xml version="1.0" encoding="UTF-8"?>”一行 java读取该 ...
- java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】
java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...
- 利用SAX解析读取XML文件
xml 这是我的第一个BLOG,今天在看<J2EE应用开发详解>一书,书中讲到XML编程,于是就按照书中的步骤自己测试了起来,可是怎么测试都不成功,后来自己查看了一遍源码,发现在读 ...
- PHP读取XML
books.xml文件: 代码 <books> <book> <author>Jack Herrington</author> <title> ...
- C++读取XML,tinyXml的使用
前言: 最近在开发的过程中,有个需求是对xml进行格式转化,从一种格式转化到另外一种格式.因此,就需要读取xml进行处理.原本打算写成工具在linux下运行,不过后来考虑到和系统结合,最后也就使用了前 ...
- 利用freemarker+SAX解析xml的方式对excel文件字段校验
利用freemarker对参数进行校验这篇文章主要用到的技术点: 自定义注解的使用反射机制SAX解析xmlFreemarker的运用我们在工作中经常需要上传excel文件,然后在对文件中的字段进行校验 ...
- java读取 xml文件
java读取xml文件的四种方法 转自https://www.cnblogs.com/lingyao/p/5708929.html Xml代码 1 <?xml version="1. ...
- Android 使用pull,sax解析xml
pull解析xml文件 1.获得XmlpullParser类的引用 这里有两种方法 //解析器工厂 XmlPullParserFactory factory=XmlPullParserFactory. ...
随机推荐
- 前端学习笔记-HTML(一)
- (转载)RxJava 与 Retrofit 结合的最佳实践
RxJava 与 Retrofit 结合的最佳实践 作者:tough1985 感谢 DaoCloud 为作者提供的 500 RMB 写作赞助: 成为赞助方 /开始写作 前言 RxJava和Retrof ...
- HighCharts 图表插件 自定义绑定 时间轴数据
HighCharts 图表插件 自定义绑定 时间轴数据,解决时间轴自动显示数据与实际绑定数据时间不对应问题! 可能要用到的源码片段:http://code.662p.com/list/14_1.htm ...
- JavaScript Math 对象常用方法
Math.abs(x):可返回数的绝对值 Math.ceil(x):向上取整 Math.floor(x):向下取整 Math.max(x,y):最大值 Math.min(x,y):最小值 Math.r ...
- Python Tutorial笔记
Python Tutorial笔记 Python入门指南 中文版及官方英文链接: Python入门指南 (3.5.2) http://www.pythondoc.com/pythontutorial3 ...
- (转) RabbitMQ学习之工作队列(java)
http://blog.csdn.net/zhu_tianwei/article/details/40887717 参考:http://blog.csdn.NET/lmj623565791/artic ...
- Jquery数字转盘:
项目中,在充值流程中,加入了1个抽奖环节,需要转盘显示抽中的虚拟货币.网上找了相关的特效,最后锁定在这个特效上:http://www.jb51.net/jiaoben/319636.html.因为用的 ...
- B站真的是一个神奇的地方,初次用Python爬取弹幕。
"网上冲浪""886""GG""沙发"--如果你用过这些,那你可能是7080后: "杯具"" ...
- JS 公鸡2文一只、母鸡1文一只、小鸡0.5文一只若一共有100文钱买100只鸡有多少种方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 路飞学城Python-Day80
36-模板语法之继承 Django模版引擎中最强大也是最复杂的部分就是模版继承了.模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks . ...