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;
}

最新文章

  1. 使用sublime text 开发node.js
  2. iar调试
  3. C#学习笔记 -- Attribute
  4. 未能找到元数据文件“引用的DLL的路径”
  5. CLOB和BLOB的区别
  6. ASP.NET-----Repeater数据控件的用法总结(转)
  7. 延迟加载 ERROR org.hibernate.LazyInitializationException:42 - could not initialize proxy - ...
  8. linux下登入mysql和加压zip文件
  9. Java 继承详解
  10. cocos2d-x 纹理研究
  11. 练习--python中的Queue与多进程(multiprocessing)
  12. C51单片机内存优化
  13. Please verify you invoked Maven from the correct directory
  14. js导入的注意.txt
  15. Vue.js组件间通信方式总结
  16. 图像三维灰度分布图——matlab
  17. python之路--内置函数03
  18. Stephen Wolfram自述
  19. java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec 解决方案
  20. 20145335郝昊《网络对抗技术》Exp6 信息搜集技术

热门文章

  1. 函数的arguments
  2. CSS vs. JS Animation: 哪个更快
  3. 了解jQuery的$符号
  4. DataTable和DataRow和DataColumn ~~~~~~~~~~[][]
  5. Vmware安装Linux系统的vmware-tools
  6. [Intermediate Algorithm] - Spinal Tap Case
  7. jQuery 父级,祖先,兄弟,等选择性操作
  8. 【转】Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
  9. HH的项链 树状数组动态维护前缀
  10. 《黑白团团队》第八次团队作业:Alpha冲刺 第四天