QT 遍历多层次的XML文档
2015-02-28 16:50
267 查看
网上的例子大多是简单的例子的使用,但是对于多层次的或是未知层次的没有相应的记录。自己写了一个QT版的遍历XML的类NodeIterator
nodeiterator.h文件
nodeiterator.cpp文件
有了这个类就可以根据名称检索相应的节点
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);
}
}
}
}
相关文章推荐
- AJAX 学习笔记(5) 处理XML文档的DOM元素属性和遍历DOM元素方法
- Delphi 中遍历 XML 文档的完整示例
- 利用dom4j解析xml文档,自动遍历节点属性
- Qt 处理XML 文档的三种方式简介——DOM、SAX、流处理
- [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
- 遍历XML文档的所有节点及属性(ASP)
- Dom 解析xml文档,实现xml文档结点的增删改查,遍历
- Qt中xml元素的遍历
- 处理及遍历XML文档DOM元素属性及方法整理
- java Dom 解析xml文档,实现xml文档结点的增删改查,遍历
- Delphi 中遍历 XML 文档的完整示例
- 使用XmlDocument中的XmlElement遍历xml文档
- microsoft.xmldom(一) xml文档遍历js
- 【转】循环递归遍历XML文档或按某要求遍历XML文档
- Qt创建那个XML文档,并且对它实现查找,更新,插入等操作
- Delphi 中遍历 XML 文档的完整示例
- Qt的Dom来操作XML文档
- XML遍历文档树(广度优先与递归)
- qt xml之DOM方式来操作XML文档
- 学习: .NET XML实例演练,遍历XML文档和构造XML文档