QT xml解析(QXmlStreamReader、DOM)
目录
一、QXmlStreamReader
二、DOM
一、QXmlStreamReader
解析常用到的函数含义:
readNext() | 从xml输入流中读取下一个记号 |
name() | 记号的名称,即 |
isStartElement() | 判断当前已读取的记号是否为开始元素,开始元素即 |
isEndElement() | 判断当前已读取的记号是否为结束元素,结束元素即 |
readElementText() | 读取当前记号对应的文本值,文本值 |
attributes() | 获取含有属性的节点的属性 |
atEnd() | 判断是否为文件结尾 |
setDevice(QIODevice * device) | 设置好要解析的XML文件 |
readElementText () | 获取节点之间的文本 |
1——导入一个xml文件或字符串的方式
//方式一QXmlStreamReader reader(sXMLContent);//方式二QXmlStreamReader reader;reader.addData(sXMLContent);//要解析的字符串//方式三QFile f("./test/xml);reader.setDevice(f);//要解析的xml文件
示例1:解析出某个节点下的所有属性值
bool ParseXmlTools::parseXmlByXsr(const QString sXmlSrc, const QString sTagName, const QString sAtrribute, QString &sAtrributeValue, QString &sErrorMsg){ QXmlStreamReader xsrReader; xsrReader.addData(sXmlSrc);//要解析的XML while(!xsrReader.atEnd()) { //函数从输入流中读取下一个标签 xsrReader.readNext(); if(xsrReader.isStartElement() && xsrReader.name() == sTagName) {//获取标签的属性 QXmlStreamAttributes attrs = xsrReader.attributes(); foreach(QXmlStreamAttribute attr, attrs) { //结果 sNodeName = attr.name().toString(); //获得属性名; sNodeValue = attr.value().toString(); //获得属性值; }/如果是想获取某个节点下的某个属性的属性值if(attrs .hasAttribute(sAtrribute)) { sAtrributeValue = xsaAttributes.value(sAtrribute).toString(); break; }*/} } return true;}
二、DOM
三个重要DOM 节点属性:
nodeName
nodeValue
nodeType
nodeName(只读) | 元素节点的 nodeName 与标签名相同 |
属性节点的 nodeName 是属性的名称 | |
文本节点的 nodeName 永远是 #text | |
文档节点的 nodeName 永远是 #document |
nodeValue 属性规定节点的值 | 元素节点的 nodeValue 是 undefined |
文本节点的 nodeValue 是文本自身 | |
属性节点的 nodeValue 是属性的值 |
示例:获取某个节点下的属性值
bool ParseXmlTools::parseXmlByDom(const QString sXmlSrc,const QString sTagName, const QString sAtrribute, QString &sAtrributeValue, QString &sErrorMsg){ /* 1 入参判断 2 设置DOM树 开始解析XML 3 开始循环读取标签 4 得到属性值,并赋值传出去 */ //传入的参数不能为空 if( sXmlSrc.isEmpty() || sTagName.isEmpty() || sAtrribute.isEmpty() ) { sErrorMsg = QString::fromLocal8Bit("参数不能为空"); return false; } QDomDocument dDoc; int iErrorLine; int iErrorCol; //第二个参数设为false的原因__禁用命名空间的处理 if(!dDoc.setContent(sXmlSrc,false,&sErrorMsg,&iErrorLine,&iErrorCol)) { sErrorMsg = QString::fromLocal8Bit("解析失败"); return false; } //获取根节点 QDomElement deRootNode = dDoc.documentElement(); if(deRootNode.tagName() == "message") { QDomNode dnChild = deRootNode.firstChild(); while(!dnChild.isNull()) { if(dnChild.toElement().tagName() == sTagName) { if(dnChild.hasAttributes()) { sAtrributeValue = dnChild.toElement().attribute(sAtrribute); } } dnChild = dnChild.nextSibling(); } } return true;}
或许你会想知道怎么直接获得某个标签下的属性值