博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt解析XML文件(QDomDocument)
阅读量:2194 次
发布时间:2019-05-02

本文共 2338 字,大约阅读时间需要 7 分钟。

http://blog.sina.com.cn/s/blog_a6fb6cc90101eugv.html

关于XML及其使用场景不在此多做介绍,今天主要介绍Qt中对于XML的解析。QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX,两者的区别是什么呢?

DOM(Document ObjectModel):将XML文件保存为树的形式,
操作简单,
便于访问。
SAX(Simple APIfor XML):接近于底层,速度较快,但不便于访问。
如果要使用XML时,需添加下行代码:
    #include
并在.pro文件中添加:
    QT += xml
   
Note that QXmlStream* classes are inQtCore,这句话是说QXmlStreamReader和QXmlStreamWriter不在模块QtXml中,而是在QtCore中,该模块只涉及DOM和SAX基于XML的接口。
此模块中包含的类不再多作介绍,详情请查看:
例子:
person.xml文件如下所示:
解析方法:
void ParseXML::parse(QString file_name) 
{  
    if(file_name.isEmpty()) 
       return;  
  
    QFile file(file_name); 
   if(!file.open(QFile::ReadOnly | QFile::Text))
    { 
       QMessageBox::information(NULL, QString("title"),QString("open error!"));
       return;  
    } 
  
    QDomDocument document; 
    QString error; 
    int row = 0, column = 0; 
   if(!document.setContent(&file, false, &error, &row,&column))
    { 
       QMessageBox::information(NULL, QString("title"),QString("parse file failed at line row and column") +QString::number(row, 10) + QString(",") + QString::number(column,10));
       return;  
    } 
  
   if(document.isNull())
    { 
       QMessageBox::information(NULL, QString("title"),QString("document is null!"));
       
       return;  
    } 
  
    QDomElement root =document.documentElement();  
   //root_tag_name为persons
    QString root_tag_name =root.tagName();
   if(root.hasAttribute("name"))
    {
       //name为Qt
       QString name =root.attributeNode("name").value(); 
    }
      
    //获取id="1"的节点
    QDomElement person =root.firstChildElement();  
   if(person.isNull()) 
       return; 
    QString person_tag_name= person.tagName();
    //id为1
    QString id =person.attributeNode("id").value();
    //获取子节点,数目为2
    QDomNodeList list =root.childNodes();
    int count =list.count();
    for(int i=0; i
    {
       QDomNode dom_node = list.item(i);
       QDomElement element =dom_node.toElement();
       //获取id值,等价
       QString id_1 =element.attributeNode("id").value(); 
       QString id_2 = element.attribute("id");
       //获取子节点,数目为4,包括:name、age、email、website
       QDomNodeList child_list =element.childNodes();
       int child_count = child_list.count();
       for(int j=0; j
       {
           QDomNodechild_dom_node = child_list.item(j);
          QDomElement child_element = child_dom_node.toElement();
           QStringchild_tag_name = child_element.tagName();
           QStringchild__tag_value = child_element.text();
       }
    }
   //按照name、age、email、website的顺序获取值
    QDomElement element =person.firstChildElement();  
   while(!element.isNull())
    { 
       QString tag_name = element.tagName();
       QString tag_value = element.text();
       element = element.nextSiblingElement(); 
    } 
}  

转载地址:http://qriub.baihongyu.com/

你可能感兴趣的文章
Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型
查看>>
Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)
查看>>
深入理解JVM虚拟机1:JVM内存的结构与消失的永久代
查看>>
深入理解JVM虚拟机3:垃圾回收器详解
查看>>
深入理解JVM虚拟机4:Java class介绍与解析实践
查看>>
深入理解JVM虚拟机5:虚拟机字节码执行引擎
查看>>
深入理解JVM虚拟机6:深入理解JVM类加载机制
查看>>
深入了解JVM虚拟机8:Java的编译期优化与运行期优化
查看>>
深入理解JVM虚拟机9:JVM监控工具与诊断实践
查看>>
深入理解JVM虚拟机10:JVM常用参数以及调优实践
查看>>
深入理解JVM虚拟机11:Java内存异常原理与实践
查看>>
深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战
查看>>
深入理解JVM虚拟机13:再谈四种引用及GC实践
查看>>
Spring源码剖析1:Spring概述
查看>>
Spring源码剖析2:初探Spring IOC核心流程
查看>>
Spring源码剖析3:Spring IOC容器的加载过程
查看>>
Spring源码剖析4:懒加载的单例Bean获取过程分析
查看>>
Spring源码剖析5:JDK和cglib动态代理原理详解
查看>>
Spring源码剖析6:Spring AOP概述
查看>>
Spring源码剖析7:AOP实现原理详解
查看>>