其他分享
首页 > 其他分享> > Qt解析xml文件

Qt解析xml文件

作者:互联网

        先来看看什么是xml.

        XML是可扩展标记语言(Extensible Markup Language,XML)缩写,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

        例如下面是一个xml格式的文件:

	
		200001
		zhangsan
		zhangsan@sina.cn
		zhangsan.chain.com
	
	
		200002
		lisi
		lisi@sina.cn
		lisi.sina.cn
	
	
		200003
		wangwu
		wangwu@sina.cn
		wangwu.sina.cn
	
	
		200004
		zhaoliu
		zhaoliu@sina.cn
		zhaoliu.sina.cn
	

        第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 UTF-8

        下面的内容是xml的节点元素内容,节点可以有属性,例如Data节点有id的属性,可以进行区分不同的Data.

        Msg是根元素,xml必须要包含根元素,Data是子元素(或者说节点,每个人的叫法不同),每个Data还可以包含子元素。

        C++ 解析xml有很多种形式,例如tinyxml, boost xml等,都可以对xml内容进行解析,Qt也提供了xml的解析方法,下面用QXmlStreamReaer来解析 。

      写代码前,需要先包含xml模块,如下图:

 

       创建一个控制台项目,hello.xml的内容就用上面的xml

       代码如下:

#include#include#include#includeint main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //将xml文件读取数据
    QFile file("D:/QtCreator_Project/XmlParse_01/hello.xml");

    bool isOk = file.open(QIODevice::ReadOnly | QIODevice::Text);
    if(isOk)
    {
        QXmlStreamReader reader(&file);
        //reader.setDevice(&file);  也可以使用这种形式

        while(!reader.atEnd())
        {
            //判断是否是节点的开始
            if(reader.isStartElement())
            {
                QXmlStreamAttributes attributes = reader.attributes();

                //判断是否存在属性"id"
                if(attributes.hasAttribute("id"))
                {
                    qDebug() << attributes.value("id").toString();
                }

                //判断当前节点的名字是否为Number
                if(reader.name() == "Number")
                {
                    qDebug() << reader.readElementText();
                }
                else if(reader.name() == "Name")  //判断当前节点的名字是否为Name
                {
                    qDebug() << reader.readElementText();
                }
                else if(reader.name() == "email")  //判断当前节点的名字是否为email
                {
                    qDebug() << "email = " << reader.readElementText();
                }
                else if(reader.name() == "website")  //判断当前节点的名字是否为website
                {
                    qDebug() << "website " <<  reader.readElementText();
                }
            }
            else if(reader.isEndElement() && reader.name() == "Data")  //节点结束、并且节点名字为Data(含有子节点)
            {
                qDebug() << "---------------------------------";
            }

            reader.readNext();
        }

        file.close();
    }
    else
    {
        qDebug()<<"Open file hello.xml failure";
    }

    return a.exec();
}

    运行结果如下:

        有时在解析时会出错,先可以看看是否是xml格式有问题,如果能用浏览器打开,说明xml文件没问题,再看看代码是否有问题,调试看看。

标签:xml,XML,cn,sina,reader,解析,Qt
来源: https://blog.51cto.com/u_12570763/2845549