一、项目介绍
利用dom相关类读取xml文件。
dom(document object model,即文档对象模型)把xml文档转换成应用程序可以遍历的树形结构,这样便可以随机访问其中的节点。它的缺点是需要将整个xml文档读入内存,消耗内存较多。
在qt中使用qdomprocessinginstruction类来表示xml说明,元素对应qdomelement类,属性对应qdomattr类,文本内容由qdomtext类表示。所有的dom节点,比如这里的说明、元素、属性和文本等,都使用qdomnode类来表示,然后使用对应的isprocessinginstruction()、iselement()、isattr()和istext()等函数来判断是否是该类型的元素,如果是,那么就可以使用toprocessinginstruction()、toelement()、toattr()和totext()等函数转换为具体的节点类型。
二、项目基本配置
新建一个qt案例,项目名称为“domtest”,基类选择“qwidget”,取消创建ui界面复选框的选中状态,完成项目创建。
三、ui界面设计
无ui界面
四、主程序实现
4.1 node.xml
新建一个xml文件,内容为:
<?xml version="1.0" encoding="utf-8"?> <archive> <car id="1"> <attrib number="01" >排量:2393ml</attrib> <attrib number="02" >价格:43.26万元</attrib> </car> <car id="2" > <attrib number="01" >排量:1600ml</attrib> <attrib number="02" >价格:8.98万元</attrib> </car> <car id="3" > <attrib number="01" >排量:1600ml</attrib> <attrib number="02" >价格:11.25万元</attrib> </car> <car id="4" > <attrib number="01" >排量:1997ml</attrib> <attrib number="02" >价格:15.38万元</attrib> </car> </archive>
4.2 pro文件
在domtest.pro文件中添加如下代码:
qt+=xml
4.3 main.cpp
核心代码如下:
//新建qdomdocument类对象,它代表一个xml文档 qdomdocument doc; //建立指向“node.xml”文件的qfile对象 qfile file("node.xml"); //以只读方式打开 if(!file.open(qiodevice::readonly)) { qdebug()<<"无法打开"; return 0; } //将文件内容读到doc中 qstring errormsg; if(!doc.setcontent(&file,&errormsg)) { qdebug()<<errormsg;//如果读取出错则返回错误类型 file.close(); return 0; } //关闭文件 file.close(); //获得doc的第一个节点,即xml说明 qdomnode firstnode=doc.firstchild(); //输出xml说明 qdebug()<<firstnode.nodename(); qdebug()<<firstnode.nodevalue();
运行结果:
“xml”
“version=‘1.0’ encoding=‘utf-8’”
如果不希望看到引号,可以进行如下修改:
qdebug() << qprintable(firstnode.nodename()); qdebug()<< qprintable(firstnode.nodevalue());
运行结果:
xml
version=‘1.0’ encoding=‘utf-8’
查找id节点及其对应的名称:
//如果节点不为空 while(!n.isnull()) { if(n.iselement()) //如果节点是元素 { qdomelement e=n.toelement();//将其转换为元素 qdebug()<<e.tagname();//返回元素标记 qdebug()<<e.attribute("id");//返回元素id属性的值 } n=n.nextsibling(); //下一个兄弟节点 }
运行结果:
“car”
“1”
“car”
“2”
“car”
“3”
“car”
“4”
输出所有子节点的内容:
//如果节点不为空 while(!n.isnull()) { if(n.iselement()) //如果节点是元素 { qdomelement e=n.toelement();//将其转换为元素 qdomnodelist list=e.childnodes(); // 获得元素e的所有子节点的列表 // 遍历该列表 for(int i=0;i<list.count();i++) { qdomnode node=list.at(i); if(node.iselement()) qdebug()<<node.toelement().tagname(); qdebug()<<node.toelement().text(); } } n=n.nextsibling(); //下一个兄弟节点 }
这里使用了childnodes()函数获得了元素所有子节点的列表,然后通过遍历这个列表实现了遍历其所有子元素。运行结果:
“attrib”
“排量:2393ml”
“attrib”
“价格:43.26万元”
“attrib”
“排量:1600ml”
“attrib”
“价格:8.98万元”
“attrib”
“排量:1600ml”
“attrib”
“价格:11.25万元”
“attrib”
“排量:1997ml”
“attrib”
“价格:15.38万元”
五、效果演示
完整结果如下:
到此这篇关于qt利用dom类实现读取xml文件的文章就介绍到这了,更多相关qt读取xml文件内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!
需要了解更多c/c++开发分享Qt利用DOM类实现读取xml文件,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/1237819.html