main.cpp

#include <QtGui>
#include <iostream> #include "domparser.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("DOM Parser"));
treeWidget.show(); DomParser parser(&treeWidget);
parser.readFile("in1.xml"); return app.exec();
}

DomPaser.h

#ifndef DOMPARSER_H
#define DOMPARSER_H class QDomElement;
class QString;
class QTreeWidget;
class QTreeWidgetItem; class DomParser
{
public:
DomParser(QTreeWidget *tree);
//打开传递来的文件
bool readFile(const QString &fileName); private:
void parseBookindexElement(const QDomElement &element);
void parseEntryElement(const QDomElement &element,
QTreeWidgetItem *parent);
void parsePageElement(const QDomElement &element,
QTreeWidgetItem *parent); QTreeWidget *treeWidget;
}; #endif

domparser.cpp

#include <QtGui>
#include <QtXml>
#include <iostream> #include "domparser.h" DomParser::DomParser(QTreeWidget *tree)
{
treeWidget = tree;
} //读文件
bool DomParser::readFile(const QString &fileName)
{
QFile file(fileName);
//判断是否打开成功
if (!file.open(QFile::ReadOnly | QFile::Text)) {
std::cerr << "Error: Cannot read file " << qPrintable(fileName)
<< ": " << qPrintable(file.errorString())
<< std::endl;
return false;
} //错误信息
QString errorStr;
//错误行
int errorLine;
//错误项
int errorColumn; QDomDocument doc;
//setContent解析XML文档,如果文档没打开,
//setContent将自动打开,false参数将禁用命名空间的处理.
if (!doc.setContent(&file, false, &errorStr, &errorLine,
&errorColumn)) {
std::cerr << "Error: Parse error at line " << errorLine << ", "
<< "column " << errorColumn << ": "
<< qPrintable(errorStr) << std::endl;
return false;
} //如果解析成功,就对QDomDocument调用documentElement获取它唯一的
//QDomElement子对象
QDomElement root = doc.documentElement();
//判断是否有<bookindex>元素,如果有就调用QDomElement来解析
if (root.tagName() != "bookindex") {
std::cerr << "Error: Not a bookindex file" << std::endl;
return false;
} parseBookindexElement(root);
return true;
} //遍历所有子节点
void DomParser::parseBookindexElement(const QDomElement &element)
{
//发现下一个子对象
QDomNode child = element.firstChild();
//如果不为空
while (!child.isNull()) {
if (child.toElement().tagName() == "entry")
{
parseEntryElement(child.toElement(),
treeWidget->invisibleRootItem());
}
child = child.nextSibling();
}
} //entry标签处理
void DomParser::parseEntryElement(const QDomElement &element,
QTreeWidgetItem *parent)
{
QTreeWidgetItem *item = new QTreeWidgetItem(parent);
item->setText(, element.attribute("term")); QDomNode child = element.firstChild();
while (!child.isNull())
{
//如果是entry调用entry处理
if (child.toElement().tagName() == "entry")
{
parseEntryElement(child.toElement(), item);
}
//如果是page调用page处理
else if (child.toElement().tagName() == "page")
{
parsePageElement(child.toElement(), item);
}
//继续处理下一个
child = child.nextSibling();
}
} //处理page项
void DomParser::parsePageElement(const QDomElement &element,
QTreeWidgetItem *parent)
{
QString page = element.text();
QString allPages = parent->text();
if (!allPages.isEmpty())
allPages += ", ";
allPages += page;
parent->setText(, allPages);
}

40.DOM读取XML的更多相关文章

  1. JAva使用DOM读取XML数据(解析)

    原来一切都是有套路的 使用DOM解析XML文档步骤 1.创建解析器工厂对象 DocumentBuildFactory对象 2.由解析器工厂对象创建解析器对象,即DocumentBuilder对象 3. ...

  2. PHP中利用DOM和simplxml读取xml文档

    实例  用DOM获取下列xml文档中所有金庸小说的书名,该xml文档所在位置为 ./books.xml: <?xml version="1.0" encoding=" ...

  3. JAVA读取XML,JAVA读取XML文档,JAVA解析XML文档,JAVA与XML,XML文档解析(Document Object Model, DOM)

    使用Document Object Model, DOM解析XML文档 也可参考我的新浪博客:http://blog.sina.com.cn/s/blog_43ac5543010190w3.html ...

  4. PHP中使用DOM读取解析XML属性值一例

    先看XML文件结构,与常见的文件略有不同,数据并不是用闭合标签保存的,而是直接保存在属性值中. <?xml version="1.0" encoding="utf- ...

  5. C#中常用的读取xml的几种方法(转)

    本文完全来源于http://blog.csdn.net/tiemufeng1122/article/details/6723764,仅作个人学习之用. XML文件是一种常用的文件格式,例如WinFor ...

  6. C#读取Xml【转】

      XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖 ...

  7. C#中经常使用的几种读取XML文件的方法

    XML文件是一种经常使用的文件格式,比如WinForm里面的app.config以及Web程序中的web.config文件,还有很多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖 ...

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

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

  9. java读取 xml文件

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

随机推荐

  1. aspnet_regiis加密文件提示路径中具有非法字符

    加密结果受当前目录影响,不知道是不是哪里操作错误,mark.   Web.config文件位置:E:\Web\Surgery 加密成功,上图命令最后有个".",表示web.conf ...

  2. undefined reference to “boost” in Qt—Ubuntu

    一:使用PCL时遇到的问题 原因:缺少boost的lib包含: 在Pro文件里面添加: LIBS += -lboost_system .....................等库文件包含 二:编译B ...

  3. Q1002 四则运算

    #include<iostream> using namespace std; int main() { long long sum1,sum2,sum3,sum4; long int a ...

  4. C#结束Explorer进程

    private void Form1_Load(object sender, EventArgs e) { Process[] processes = Process.GetProcesses();/ ...

  5. 一个单元格占两行三列的HTML代码为

    主要是这两个属性: colspan 单元格占多少列 rowspan 单元格占多少行 <table width="200" border="1">&l ...

  6. bzoj 1293: [SCOI2009]生日礼物 问题转化 + 性质分析 + 滚动数组优化

    Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩 ...

  7. 路飞学城Python-Day151

    sprapy框架能够在pycharm中调试的方式 需要在配置文件中加上一个文件,文件的内容为 start.py #!/usr/bin/env python # -*- coding:utf-8 -*- ...

  8. centos7.XXX配置python3环境

    众做周知,centos 是自带python2.7的.可是随着社会的进步,科技的发展,技术一步步更新换代,python2.7已经不足以满足项目的需求.这时候python3横空出世. 下面跟着我来一起实现 ...

  9. hibernate注解--@transient

    @transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性. 如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Bas ...

  10. Linux系统下的 /etc/fstab 文件解读

    1 [root@localhost ~]# cat /etc/fstab 2 3 # 4 # /etc/fstab 5 # Created by anaconda on Sat Nov 3 12:03 ...