#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <qmessagebox.h>
#include <qdebug.h>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle(tr("XML Reader"));
treeWidget = new QTreeWidget(this);
QStringList headers;
headers << "Items" << "Pages";
treeWidget->setHeaderLabels(headers);
setCentralWidget(treeWidget);
qDebug()<<QApplication::applicationDirPath();
}
bool MainWindow::readFile(const QString &fileName)
{
QFile file(QApplication::applicationDirPath() + "/demo.xml");
if (!file.open(QFile::ReadOnly | QFile::Text))
{
QMessageBox::critical(this, tr("Error"),
tr("Cannot read file %1").arg(fileName));
return false;
}
reader.setDevice(&file);
while (!reader.atEnd())
{
if (reader.isStartElement())
{
qDebug()<<"2222222222222222";
if (reader.name() == "bookindex")
{
readBookindexElement();//递归下降算法,层层读取
}
else
{
reader.raiseError(tr("Not a valid book file"));
}
}
else
{
qDebug()<<"111111111111111";
reader.readNext(); //循坏调用首次移动3次,后面移动一次
}
}
file.close();
if (reader.hasError())
{
QMessageBox::critical(this, tr("Error"),
tr("Failed to parse file %1").arg(fileName));
return false;
}
else if (file.error() != QFile::NoError)
{
QMessageBox::critical(this, tr("Error"),
tr("Cannot read file %1").arg(fileName));
return false;
}
return true;
}
void MainWindow::readBookindexElement()
{
Q_ASSERT(reader.isStartElement() && reader.name() == "bookindex");//不是则会报错
reader.readNext(); // 读取下一个记号,它返回记号的类型
while (!reader.atEnd())
{
if (reader.isEndElement())
{
reader.readNext();
break;
}
if (reader.isStartElement())
{
if (reader.name() == "entry")
{
readEntryElement(treeWidget->invisibleRootItem());
}
else
{
skipUnknownElement();
}
}
else
{
reader.readNext();
}
}
}
void MainWindow::readEntryElement(QTreeWidgetItem *parent)
{
QTreeWidgetItem *item = new QTreeWidgetItem(parent);
item->setText(0, reader.attributes().value("term").toString());//元素的属性
reader.readNext();
while (!reader.atEnd())
{
if (reader.isEndElement())
{
reader.readNext();
break;
}
if (reader.isStartElement())
{
if (reader.name() == "entry")
{
readEntryElement(item);
}
else if (reader.name() == "page")
{
readPageElement(item);
}
else
{
skipUnknownElement();
}
}
else
{
reader.readNext();
}
}
}
void MainWindow::readPageElement(QTreeWidgetItem *parent)
{
QString page = reader.readElementText();
if (reader.isEndElement())
{
qDebug()<<"3333333333333333";
reader.readNext();
}
QString allPages = parent->text(1);
if (!allPages.isEmpty())
{
allPages += ", ";
}
allPages += page;
parent->setText(1, allPages);
}
void MainWindow::skipUnknownElement()
{
reader.readNext();
while (!reader.atEnd())
{
if (reader.isEndElement())
{
reader.readNext();
break;
}
if (reader.isStartElement())
{
skipUnknownElement();
}
else
{
reader.readNext();
}
}
}
MainWindow::~MainWindow()
{
delete ui;
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
XML(eXtensible Markup Language)是一种通用的文本格式,被广泛运用于数据交换和数据存储(虽然近年来 JSON 盛行,大有取代 XML 的趋势,但是对于一些已有系统和架构,比如 WebService,由于历史原因,仍旧会继续使用 XML)。XML 由 World Wide Web Consortium(W3C)发布,作为 SHML(Standard Generalized Markup Language)的一种轻量级方言。XML 语法类似于 HTML,与后者的主要区别在于 XML 的标签不是固定的,而是可扩展的;其语法也比 HTML 更为严格。遵循 XML 规范的 HTML 则被称为 XHTML(gml(1969)->sgml(1985)->html(1993)->xml(1998))。
资源推荐
资源详情
资源评论
收起资源包目录
QtCore.zip (54个子文件)
QtCore
QtXmLRead
Makefile.Debug 43KB
QtXmLRead.pro.user 23KB
.qmake.stash 726B
QtXmLRead.pro 1024B
Makefile.Release 44KB
ui_mainwindow.h 2KB
main.cpp 212B
mainwindow.ui 654B
debug
moc_mainwindow.cpp 3KB
moc_mainwindow.o 482KB
moc_predefs.h 10KB
QtXmLRead.exe 1.47MB
mainwindow.o 575KB
demo.xml 693B
main.o 520KB
mainwindow.cpp 4KB
mainwindow.h 686B
Makefile 28KB
release
QtXmlSax
QtXmlSax
QtXmlSax.pro 1KB
Makefile.Debug 46KB
QtXmlSax.pro.user 23KB
.qmake.stash 726B
Makefile.Release 46KB
ui_mainwindow.h 2KB
main.cpp 250B
mainwindow.ui 654B
debug
moc_mainwindow.cpp 3KB
moc_mainwindow.o 469KB
QtXmlSax.exe 1.43MB
moc_predefs.h 10KB
mainwindow.o 530KB
demo.xml 693B
main.o 525KB
mainwindow.cpp 3KB
mainwindow.h 1KB
Makefile 29KB
release
QtXmlDom
QtXmlDom
Makefile.Debug 46KB
.qmake.stash 726B
Makefile.Release 46KB
ui_mainwindow.h 2KB
QtXmlDom.pro.user 23KB
main.cpp 250B
mainwindow.ui 654B
debug
moc_mainwindow.cpp 3KB
moc_mainwindow.o 480KB
QtXmlDom.exe 1.46MB
moc_predefs.h 10KB
mainwindow.o 563KB
demo.xml 693B
main.o 525KB
mainwindow.cpp 3KB
mainwindow.h 696B
Makefile 29KB
QtXmlDom.pro 1KB
release
共 54 条
- 1
资源评论
- maomao0002582020-01-22很好的资源,很棒
漫天飞舞的雪花
- 粉丝: 153
- 资源: 23
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功