QXmlStreamReader解析XML文件

如何使用QXmlStreamReader来解析格式良好的XML,Qt的文档中指出,它是一种更快、更方便的Qt自己的SAX解析器(QXmlSimpleReader)的替代,它也较快,在某种情况下,比DOM(QDomDocument)更方便。
      XML文件:
       Qt解析XML文件(QXmlStreamReader)

      解析方法:
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,直到结束
      while(!xml.atEnd() && !xml.hasError())
{
            //读取下一个element.
            QXmlStreamReader::TokenType token = xml.readNext();

            //如果获取的仅为StartDocument,则进行下一个
            if(token == QXmlStreamReader::StartDocument)
{
                  continue;
            }

            //如果获取了StartElement,则尝试读取
            if(token == QXmlStreamReader::StartElement)
{
                  //如果为persons,直接进入下一个
                  if(xml.name() == "persons")
{
                        continue;
                  }
                  
//如果为person,则对其进行解析
                  if(xml.name() == "person")
{
                        persons.append(this->parsePerson(xml));
                  }
            }
      }
   
      if(xml.hasError())
{
QMessageBox::information(NULL, QString("parseXML"), xml.errorString());
      }
      
//从reader中删除所有设备、数据,并将其重置为初始状态
      xml.clear();
}
 
QMap ParseXML::parsePerson(QXmlStreamReader& xml)
{
      QMap person;

      //检查是否获取person
      if(xml.tokenType() != QXmlStreamReader::StartElement &&
                  xml.name() == "person")
{
            return person;
      }

      //获取person属性
      QXmlStreamAttributes attributes = xml.attributes();
      if(attributes.hasAttribute("id"))
{
            person["id"] = attributes.value("id").toString();
      }
      
//操作下一个
      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());
}


2、简单解析某一元素
  1. QFile probeFile ("1.xml");  
  2. if( probeFile.open(QIODevice::ReadOnly | QIODevice::Text) )   
  3. {  
  4.     QXmlStreamReader xmlReader(&probeFile);  
  5.     xmlReader.readNext();  
  6.     while(!xmlReader.atEnd())  
  7.     {  
  8.         if (xmlReader.isStartElement())  
  9.         {  
  10.             if (xmlReader.name() == "description")  
  11.             {  
  12.                 QString temp = xmlReader.readElementText();  
  13.                 qDebug() << temp;  
  14.             }  
  15.   
  16.             if (xmlReader.name() == "computation_date")  
  17.             {  
  18.                 QString temp = xmlReader.readElementText();  
  19.                 qDebug() << temp;  
  20.             }  
  21.   
  22.             if (xmlReader.name() == "transformation")  
  23.             {  
  24.                 QString temp = xmlReader.readElementText();  
  25.                 qDebug() << temp;  
  26.             }  
  27.         }  
  28.           
  29.         xmlReader.readNext();  
  30.   
  31.     }  
  32. }  

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QXmlStreamReader是Qt中的一个XML解析器,可以用来解析XML文件。它是基于事件驱动的解析器,逐行读取XML文件并发出相应的事件,应用程序可以根据这些事件来处理XML数据。在使用QXmlStreamReader时,我们需要先创建一个QXmlStreamReader对象,然后使用该对象的readNext()函数读取XML文件的下一行,再根据返回的事件类型来处理相应的数据。 例如,以下代码片段展示了如何使用QXmlStreamReader解析一个简单的XML文件: ```cpp QFile file("example.xml"); if (!file.open(QFile::ReadOnly | QFile::Text)) { qDebug() << "Failed to open file"; return; } QXmlStreamReader xml(&file); while (!xml.atEnd()) { xml.readNext(); if (xml.isStartElement()) { qDebug() << "Element: " << xml.name(); } else if (xml.isEndElement()) { qDebug() << "End element: " << xml.name(); } else if (xml.isCharacters() && !xml.isWhitespace()) { qDebug() << "Text: " << xml.text(); } } if (xml.hasError()) { qDebug() << "XML error: " << xml.errorString(); } file.close(); ``` 在上面的代码中,我们首先打开一个XML文件,并创建一个QXmlStreamReader对象来读取文件。然后,在while循环中,我们使用readNext()函数逐行读取XML文件的下一行,并根据事件类型来处理数据。如果当前行是一个元素的开始标签,我们会输出它的名称;如果是一个元素的结束标签,我们也会输出它的名称;如果是元素的文本内容,我们会输出文本内容。最后,我们检查是否有任何XML错误,并关闭文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值