127 lines
3.2 KiB
C++
127 lines
3.2 KiB
C++
#include "elementhashtable.h"
|
||
#include <iostream>
|
||
ElementHashtable::ElementHashtable(QObject *parent) :
|
||
QObject(parent)
|
||
{
|
||
}
|
||
|
||
bool ElementHashtable::child(QXmlStreamReader &reader)
|
||
{
|
||
|
||
|
||
QStringRef elementName;
|
||
elementName=reader.name();
|
||
QString id;
|
||
if(reader.attributes().hasAttribute("rdf:ID"))
|
||
{
|
||
id=reader.attributes().value("rdf:ID").toString();
|
||
}
|
||
BasicElementInfo *pointer=NULL;
|
||
if(elementName=="BusbarSection")
|
||
{
|
||
pointer=new BusbarSection(this);
|
||
pointer->parse(reader);
|
||
}
|
||
if(elementName=="Terminal")
|
||
{
|
||
pointer=new Terminal(this);
|
||
pointer->parse(reader);
|
||
}
|
||
if(elementName=="ACLineSegment")
|
||
{
|
||
pointer=new ACLineSegment(this);
|
||
pointer->parse(reader);
|
||
}
|
||
if(elementName=="Breaker")
|
||
{
|
||
pointer=new Breaker(this);
|
||
pointer->parse(reader);
|
||
}
|
||
if(elementName=="Compensator")
|
||
{
|
||
pointer=new Compensator(this);
|
||
pointer->parse(reader);
|
||
}
|
||
if(elementName=="Disconnector")
|
||
{
|
||
pointer=new Disconnector(this);
|
||
pointer->parse(reader);
|
||
}
|
||
if(elementName=="PowerTransformer")
|
||
{
|
||
pointer=new PowerTransformer(this);
|
||
pointer->parse(reader);
|
||
}
|
||
if(elementName=="SynchronousMachine")
|
||
{
|
||
pointer=new SynchronousMachine(this);
|
||
pointer->parse(reader);
|
||
}
|
||
|
||
if(pointer && id!="")
|
||
{
|
||
this->eleHT[id]=pointer;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
bool ElementHashtable::goPath()
|
||
{
|
||
const QHash<QString,BasicElementInfo*> &ht=this->eleHT;
|
||
QList<QString> keys;
|
||
keys=ht.keys();
|
||
std::cout<<keys.length()<<std::endl;
|
||
for(QList<QString>::Iterator ite=keys.begin();
|
||
ite!=keys.end();
|
||
ite++)
|
||
{
|
||
BasicElementInfo *p=ht[*ite];
|
||
if(p->getName()=="BusbarSection")
|
||
{
|
||
// std::cout<<"BusbarSection"<<"\n";
|
||
BusbarSection *foo=static_cast<BusbarSection *>(p);
|
||
QString terminal=foo->getTerminal();
|
||
//找Terminal的东西
|
||
Terminal *terminalP=static_cast<Terminal *>(ht[terminal]);
|
||
std::cout<<terminalP->getID().toStdString()<<std::endl;
|
||
// std::cout<<terminalP->getConductingEquipment().toStdString()<<std::endl;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
bool ElementHashtable::parse(const QString& xmlPath)
|
||
{
|
||
QFile xmlFile(xmlPath);
|
||
|
||
int loop=0;
|
||
if(xmlFile.open(QFile::ReadOnly))
|
||
{
|
||
QXmlStreamReader reader(&xmlFile);
|
||
while(!reader.atEnd() && !reader.hasError())
|
||
{
|
||
reader.readNext();
|
||
if(reader.isStartElement())
|
||
{
|
||
if(reader.name()=="RDF")//不要读<rdf:RDF xmlns:rdf="http://www.w3.org/1999/ …… 这样一堆东西
|
||
{
|
||
continue;
|
||
}
|
||
this->child(reader);//处理根元素下的第一级子元素,也就是Substation这一类。
|
||
}
|
||
loop++;
|
||
if(loop>600000){
|
||
// break;
|
||
}
|
||
|
||
}
|
||
if(reader.hasError())
|
||
{
|
||
qDebug()<<reader.errorString()<<"\n";
|
||
qDebug()<<"line number "<<reader.lineNumber()<<"\n";
|
||
}
|
||
xmlFile.close();
|
||
}
|
||
return true;
|
||
}
|