跨境電商亞馬遜seo教程之關(guān)鍵詞是什么
如何使用QXmlStreamReader來解析格式良好的XML,Qt的文檔中指出,它是一種更快、更方便的Qt自己的SAX解析器(QXmlSimpleReader)的替代,它也較快,在某種情況下,比DOM(QDomDocument)更方便。
?
解析方法:
void ParseXML::parseXML(QString file_name)
{if(file_name.isEmpty()) return; QFile *file = new QFile(file_name); if(!file->open(QFile::ReadOnly | QFile::Text)) { QMessageBox::information(NULL, QString("title"), QString("open error!"));return; } //QXmlStreamReader操作任何QIODevice.QXmlStreamReader xml(file);QList> persons;//解析XML,直到結(jié)束while(!xml.atEnd() && !xml.hasError()){//讀取下一個(gè)element.QXmlStreamReader::TokenType token = xml.readNext();//如果獲取的僅為StartDocument,則進(jìn)行下一個(gè)if(token == QXmlStreamReader::StartDocument) {continue;}//如果獲取了StartElement,則嘗試讀取if(token == QXmlStreamReader::StartElement){//如果為persons,直接進(jìn)入下一個(gè)if(xml.name() == "persons"){continue;}//如果為person,則對(duì)其進(jìn)行解析if(xml.name() == "person"){persons.append(this->parsePerson(xml));}}}if(xml.hasError()){QMessageBox::information(NULL, QString("parseXML"), xml.errorString());}//從reader中刪除所有設(shè)備、數(shù)據(jù),并將其重置為初始狀態(tài)xml.clear();
}QMap ParseXML::parsePerson(QXmlStreamReader& xml)
{QMap person;//檢查是否獲取personif(xml.tokenType() != QXmlStreamReader::StartElement && xml.name() == "person"){return person;}//獲取person屬性QXmlStreamAttributes attributes = xml.attributes();if(attributes.hasAttribute("id")) {person["id"] = attributes.value("id").toString();}//操作下一個(gè)xml.readNext();while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == "person")) {if(xml.tokenType() == QXmlStreamReader::StartElement){if(xml.name() == "name"){this->addElementDataToMap(xml, person);}if(xml.name() == "age") {this->addElementDataToMap(xml, person);}if(xml.name() == "email") {this->addElementDataToMap(xml, person);}if(xml.name() == "website") {this->addElementDataToMap(xml, person);}}xml.readNext();}QString id = person["id"];QString name = person["name"];QString age = person["age"];QString email = person["email"];QString website = person["website"];return person;
}void ParseXML::addElementDataToMap(QXmlStreamReader& xml, QMap& map) const
{if(xml.tokenType() != QXmlStreamReader::StartElement) {return;}QString elementName = xml.name().toString();xml.readNext();if(xml.tokenType() != QXmlStreamReader::Characters) {return;}map.insert(elementName, xml.text().toString());
}