> 文档中心 > QT xml解析(QXmlStreamReader、DOM)

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;}

或许你会想知道怎么直接获得某个标签下的属性值 

电玩男