QT 遍历多层次的XML文档

网上的例子大多是简单的例子的使用,但是对于多层次的或是未知层次的没有相应的记录。自己写了一个QT版的遍历XML的类NodeIterator

nodeiterator.h文件

#ifndef NODEITERATOR_H
#define NODEITERATOR_H
#include <QDomDocument>
 
class NodeIterator
{
public:
    NodeIterator();
    NodeIterator(QDomNode root);
    bool hasNext();
    QDomNode next();
private:
    QDomNode root, current;
 
    bool isHasNext;
};
 
#endif // NODEITERATOR_H
nodeiterator.cpp文件
#include "nodeiterator.h"
 
NodeIterator::NodeIterator()
{
 
 
}
NodeIterator::NodeIterator(QDomNode root)
{
    this->root = root;
    current = root;
}
 
bool NodeIterator::hasNext(){
 
    if (!root.isNull()) {
 
        //是否当前节点有子节点
        if (!current.isNull() && current.hasChildNodes()) {
 
            //将第一个子节点变成当前节点
            current = current.firstChildElement();
            isHasNext = true;
 
        } else if (!current.isNull()&& !current.nextSiblingElement().isNull()) {
 
 
            current = current.nextSiblingElement();
            isHasNext = true;
 
        } else if (!current.isNull()) {
 
            while (!current.isNull() && current != root && current.nextSiblingElement().isNull()) {
 
                current = current.parentNode();
            }
 
            if (!current.isNull() && current != root) {
 
                current = current.nextSiblingElement();
                isHasNext = true;
 
            } else {
 
                isHasNext = false;
            }
 
        } else {
 
            isHasNext = false;
        }
 
    } else {
 
        isHasNext = false;
    }
 
    return isHasNext;
}
QDomNode NodeIterator::next() {
    return current;
}
 
 有了这个类就可以根据名称检索相应的节点 
 
 
 QFile *file=new QFile("D:/qt project/SymbolEdit/symbol.xml");
 
    if( !file->open(QFile::ReadOnly)){
        qDebug()<<"open file failed ";
        return;
    }
 
    QDomDocument   *document=new QDomDocument;
    QString         strError;
    int        errLin = 0, errCol = 0;
 
    if( !document->setContent(file, false, &strError, &errLin, &errCol) ) {
        printf( "parse file failed\n");
        return;
    }
 
    if( document->isNull() ) {
        printf( "document is null !\n" );
        return;
    }
 
    QDomElement root = document->documentElement();
    //QIterator<Node>
 
    if (!root.isNull()) {
 
        QDomNode current;
 
        QString name , epTypeAlisaName ;
 
        for (NodeIterator *it = new NodeIterator((QDomNode)root); it->hasNext();) {
 
            current = it->next();
 
            if (!current.isNull() && current.isElement()) {
 
                name = current.nodeName();
                //如果是电力图元的节点
                if (!name.isNull() && name=="epType") {
                    epTypeAlisaName = current.toElement().attribute("alisaname");
                    QString electricType = current.toElement().attribute("electricType");
                    epTypeAlisaNames->append(epTypeAlisaName);
                    epTypeAlisaNameToElectricTypeName->insert(epTypeAlisaName,electricType);
 
                }
            }
        }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇