解析Xml文件并修改QDomDocument的值
背景我需要解决一个bug需要我从xml中读取数据到QDomDocument然后获取到我想要的目标信息然后修改该信息。---------------------------------------------------------------------------------------------------------Qt QDomComment读写Xml文件(含示例源码)_qt qdomdocument 操做xml-CSDN博客QDomDocument类可以方便地读取和操作XML文件。优点易于使用XML文档缺点是相对较慢因为基于DOM)。---------------------------------------------------------------------------------------------------示例Xml文档XML 教程 | 菜鸟教程 (runoob.com)XML 文档第一行以 XML 声明开始用来表述文档的一些信息如?xml version1.0 encodingUTF-8?XML 文档实例?xml version1.0 encodingUTF-8? site nameRUNOOB/name urlhttps://www.runoob.com/url logorunoob-logo.png/logo desc编程学习网站/desc /sitename、url、logo、desc分别为标签标签内包含了要传递的信息。它必须成对出现有开始标签就需要有结束标签。class student sex男 age18 id01/id name张三/name /student student sex女 age28 id02/id name李四/name /student /class例如classxxx/classstudentyyy/studentXml文件必须包含根元素它是所有其它元素的父元素XML文档由元素构成每个元素包含开始标签结束标签和元素内容。例如id02/id读取Xml文件的信息//XML文件路径 QString path QCoreApplication::applicationDirPath()/xxx.xml; qDebug()path; //打开XML文件 QFile file(path); if(!file.open(QIODevice::ReadOnly)) { qDebug()File open faild!; return-1; } //创建QDomDocument对象用于解析XML QDomDocument doc; //通过QFile对象设置QDomDocument的内容 if(!doc.setContent(file)) { file.close(); return -1; } //关闭文件 file.close(); //解析XML //获取XML根结点 QDomElement root doc.documentElement(); //遍历每个student结点 //通过标签名获取结点列表 QDomNodeList studentList root.elementsByTagName(student); int listSize studentList.size(); for(int i 0; i listSize; i) { //通过索引获取QDomElement对象 QDomElement student studentList.at(i).toElement(); //获取sex属性值 QString sex student.attribute(sex); //获取age属性值 QString age student.attribute(age); /* *函数原型为 *QDomElement firstChildElement(const QString tagName QString()) const; *解析:参数tagName是可选的表示要查询的子元素结点的标签名。如果指定了tagName则返回 *第一个匹配标签的子元素结点如果没有指定tagName则返回第一个子元素结点。 **/ QString studentID student.firstChildElement(id).text(); //获取id元素节点的文本内容 QString studentName student.firstChildElement(name).text(); //获取name元素节点的文本内容 qDebug()student:; qDebug()sex:sex; qDebug()age:age; qDebug()studentID:studentID; qDebug()studentName:studentName; }写入Xml文件代码来自《Qt Creator快速入门》)QDomDocument doc; QDomProcessingInstruction instruction; instruction doc.createProcessingInstruction(xml,version \1.0\ encoding \UTF-8\); doc.appendChild(instruction); QDomElement root doc.createElement(QString(书库)); doc.appendChild(root); QDomElement book doc.createElement(QString(图书)); QDomAttr id doc.createAttribute(QString(编号)); id.setValue(1); book.setAttributeNode(id); QDomText text; QDomElement title doc.createElement(QString(书名)); text doc.createTextNode(QString(Qt)); title.appendChild(text); book.appendChild(title); QDomElement author doc.createElement(QString(作者)); text doc.createTextNode(QString(shiming)); author.appendChild(text); book.appendChild(author); root.appendChild(book); QFile file(my.xml); if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))return 0; QTextStream out(file); doc.save(out,4); file.close();修改书名为《Qt Creator快速入门》 作者改为霍亚飞//先把信息读取出来 //XML文件路径 QFile file(my.xml); if(!file.open(QIODevice::ReadOnly)) { qDebug()File open faild!; return -1; } //创建QDomDocument对象用于解析XML QDomDocument doc; //通过QFile对象设置QDomDocument的内容 if(!doc.setContent(file)) { file.close(); return -1; } //关闭文件 file.close(); //解析XML //获取XML根结点 QDomElement root doc.documentElement(); QDomElement book root.firstChildElement(图书); QDomElement bookName book.firstChildElement(书名); bookName.firstChild().setNodeValue(Qt Creator快速入门); QDomElement author book.firstChildElement(霍亚飞); author.firstChild().setNodeValue(sfsefes); if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))return 0; QTextStream out(file); doc.save(out,4); file.close();这里我继续使用Qt的.ui文件作为示例它是以Xml文件的形式进行存储的?xml version1.0 encodingUTF-8? ui version4.0 classMainWindow/class widget classQMainWindow nameMainWindow property namegeometry rect x0/x y0/y width731/width height460/height /rect /property property namewindowTitle stringGraphics View绘图/string /property widget classQWidget namecentralWidget widget classQWGraphicsView nameView property namegeometry rect x10/x y10/y width600/width height400/height /rect /property property namerenderHints setQPainter::Antialiasing|QPainter::TextAntialiasing/set /property property namedragMode enumQGraphicsView::RubberBandDrag/enum /property /widget /widget widget classQMenuBar namemenuBar property namegeometry rect x0/x y0/y width731/width height30/height /rect /property /widget widget classQToolBar namemainToolBar property nameiconSize size width16/width height16/height /size /property property nametoolButtonStyle enumQt::ToolButtonTextUnderIcon/enum /property attribute nametoolBarArea enumTopToolBarArea/enum /attribute attribute nametoolBarBreak boolfalse/bool /attribute addaction nameactZoomIn/ addaction nameactZoomOut/ addaction nameactRestore/ addaction nameseparator/ addaction nameactRotateLeft/ addaction nameactRotateRight/ addaction nameactEdit_Front/ addaction nameactEdit_Back/ addaction nameactGroup/ addaction nameactGroupBreak/ addaction nameseparator/ addaction nameactEdit_Delete/ addaction nameseparator/ addaction nameactQuit/ /widget widget classQStatusBar namestatusBar/ widget classQToolBar nametoolBar property namewindowTitle stringtoolBar/string /property property nameallowedAreas setQt::LeftToolBarArea/set /property property nameiconSize size width16/width height16/height /size /property property nametoolButtonStyle enumQt::ToolButtonTextUnderIcon/enum /property attribute nametoolBarArea enumLeftToolBarArea/enum /attribute attribute nametoolBarBreak boolfalse/bool /attribute addaction nameactItem_Rect/ addaction nameactItem_Ellipse/ addaction nameactItem_Circle/ addaction nameactItem_Triangle/ addaction nameactItem_Polygon/ addaction nameactItem_Line/ addaction nameactItem_Text/ /widget action nameactItem_Rect property nameicon iconset resourceres.qrc normaloff:/images/images/RECTANGL.BMP/normaloff:/images/images/RECTANGL.BMP/iconset /property property nametext string矩形/string /property property nametoolTip string添加矩形/string /property /action action nameactItem_Ellipse property nameicon iconset resourceres.qrc normaloff:/images/images/ELLIPSE.BMP/normaloff:/images/images/ELLIPSE.BMP/iconset /property property nametext string椭圆/string /property property nametoolTip string添加椭圆型/string /property /action action nameactItem_Line property nameicon iconset resourceres.qrc normaloff:/images/images/LINE.BMP/normaloff:/images/images/LINE.BMP/iconset /property property nametext string直线/string /property property nametoolTip string添加直线/string /property /action action nameactEdit_Delete property nameicon iconset resourceres.qrc normaloff:/images/images/108.bmp/normaloff:/images/images/108.bmp/iconset /property property nametext string删除/string /property property nametoolTip string删除选中的图元/string /property /action action nameactQuit property nameicon iconset resourceres.qrc normaloff:/images/images/132.bmp/normaloff:/images/images/132.bmp/iconset /property property nametext string退出/string /property property nametoolTip string退出本系统/string /property /action action nameactItem_Text property nameicon iconset resourceres.qrc normaloff:/images/images/800.bmp/normaloff:/images/images/800.bmp/iconset /property property nametext string文字/string /property property nametoolTip string添加文字/string /property /action action nameactEdit_Front property nameicon iconset resourceres.qrc normaloff:/images/images/528.bmp/normaloff:/images/images/528.bmp/iconset /property property nametext string前置/string /property property nametoolTip string居于最前面/string /property /action action nameactEdit_Back property nameicon iconset resourceres.qrc normaloff:/images/images/526.bmp/normaloff:/images/images/526.bmp/iconset /property property nametext string后置/string /property property nametoolTip string居于最后面/string /property /action action nameactItem_Polygon property nameicon iconset resourceres.qrc normaloff:/images/images/FREEFORM.BMP/normaloff:/images/images/FREEFORM.BMP/iconset /property property nametext string梯形/string /property property nametoolTip string添加梯形/string /property /action action nameactZoomIn property nameicon iconset resourceres.qrc normaloff:/images/images/zoomin.png/normaloff:/images/images/zoomin.png/iconset /property property nametext string放大/string /property property nametoolTip string放大/string /property /action action nameactZoomOut property nameicon iconset resourceres.qrc normaloff:/images/images/zoomout.png/normaloff:/images/images/zoomout.png/iconset /property property nametext string缩小/string /property property nametoolTip string缩小/string /property /action action nameactRotateLeft property nameicon iconset resourceres.qrc normaloff:/images/images/rotateleft.png/normaloff:/images/images/rotateleft.png/iconset /property property nametext string左旋转/string /property property nametoolTip string左旋转/string /property /action action nameactRotateRight property nameicon iconset resourceres.qrc normaloff:/images/images/rotateright.png/normaloff:/images/images/rotateright.png/iconset /property property nametext string右旋转/string /property property nametoolTip string右旋转/string /property /action action nameactRestore property nameicon iconset resourceres.qrc normaloff:/images/images/420.bmp/normaloff:/images/images/420.bmp/iconset /property property nametext string恢复/string /property property nametoolTip string恢复大小/string /property /action action nameactGroup property nameicon iconset resourceres.qrc normaloff:/images/images/UNGROUP.BMP/normaloff:/images/images/UNGROUP.BMP/iconset /property property nametext string组合/string /property property nametoolTip string组合/string /property /action action nameactGroupBreak property nameicon iconset resourceres.qrc normaloff:/images/images/128.bmp/normaloff:/images/images/128.bmp/iconset /property property nametext string打散/string /property property nametoolTip string取消组合/string /property /action action nameactItem_Circle property nameicon iconset resourceres.qrc normaloff:/images/images/08.JPG/normaloff:/images/images/08.JPG/iconset /property property nametext string圆形/string /property property nametoolTip string圆形/string /property /action action nameactItem_Triangle property nameicon iconset resourceres.qrc normaloff:/images/images/Icon1242.ico/normaloff:/images/images/Icon1242.ico/iconset /property property nametext string三角形/string /property property nametoolTip string三角形/string /property /action /widget layoutdefault spacing6 margin11/ customwidgets customwidget classQWGraphicsView/class extendsQGraphicsView/extends header locationglobalqwgraphicsview.h/header /customwidget /customwidgets resources include locationres.qrc/ /resources connections connection senderactQuit/sender signaltriggered()/signal receiverMainWindow/receiver slotclose()/slot hints hint typesourcelabel x-1/x y-1/y /hint hint typedestinationlabel x302/x y153/y /hint /hints /connection /connections /ui还是有难度的。最外层是标签ui内部是classwidgetlayoutdefaultcustomwidgetsresourcesconnections------------------------------------------------widget内包含propertywidgetaction--------------------------------------------------------我读取一下property namegeometry rect x0/x y0/y width731/width height460/height /rect /property property namewindowTitle stringGraphics View绘图/string /property这一段信息吧读取.ui文件的代码//解析XML QDomNode firstNode doc.firstChild(); qDebug()版本和编码信息firstNode.nodeName()firstNode.nodeValue(); // xml version1.0 encodingUTF-8 qDebug()是否是Xml说明firstNode.isProcessingInstruction(); QDomElement ui doc.documentElement(); qDebug()root tag:ui.tagName(); qDebug()root nodeType:ui.nodeType(); //QDomNode::ElementNode 1 qDebug()root hasChildNodes:ui.hasChildNodes(); //true qDebug()root childNodes count:ui.childNodes().count(); //6 qDebug()root hasAttributes:ui.hasAttributes(); //true qDebug()root hasAttribute version:ui.hasAttribute(version); //true QDomElement xWidget ui.firstChildElement(widget); qDebug()widget hasAttribute name:xWidget.hasAttribute(name); //true qDebug()widget hasAttribute class:xWidget.hasAttribute(class); //true QDomElement xProperty xWidget.firstChildElement(property); while(!xProperty.isNull()) { qDebug()xProperty.attribute(name); xProperty xProperty.nextSiblingElement(property); }