基于Qt的xml解析
2014-11-26 21:41
295 查看
基于Qt的xml解析和基于Java的类似,也是分Dom,SAX两种,这两种方式的区别在网上已经讲的很详细了,在此不赘述,只讲区别。
DOM分析器把整个XML文档转化成DOM树放在内存中,应用程序可以在任何时候访问XML文档中的任何一部分数据(随机访问)。这种方式对内存的要求较高,文档结构较复杂时比较耗效率。
SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数(事件驱动)。应用程序通过这些事件处理函数实现对XML文档的访问。
基于Qt的xml解析,实际可以通过三种方式,dom、sax,以及Qt的QXmlReader.简单的xml解析,可以采用QDomDocument,方便,且灵活性大。在此主要介绍dom方式的解析。
相关的类主要有QDomDocument,QDomNode,QDomElement。QDomNode是所有Dom
Tree相关类的基类。
相关的方法:
QDomcument::setContent(),设置需要解析的内容(可以是字符串,设备等)
QDomcument::firstChildElement();
查找某个子元素,返回查找到的子元素(QDomElement,isNull时未找到)。
QDomNdoe::toElement();//转为dom元素(返回QDomElement,具有名称,零个或多个属性)
QDomNode::nodeName(); //节点名称
QDomElement::childNodes();//子节点列表
QDomElement::tagName();//名称
QDomElement::text();//文本
QDomElemnt::attribute();//属性
上代码:
输出结果为:
span节点,text= "你好!" style= "class_Hello"
span节点,text= "Hello World!" style= ""
span节点,text= "你也好。" style= "class_Hello"
img节点,src= "test.png"
示例程序地址:http://download.csdn.net/detail/lingyun0/8202105
还可以进行创建节点等操作,具体可查Qt文档,例如:
QDomElement
elementParaForAdd = domDocument.createElement("p"); //建立一个p节点
spanElement.setAttribute("style",strSpanStyle);
//设置span节点的样式
QDomText domText = docMessageHtml.createTextNode("你好,你好。");//创建文本节点
spanElement.appendChild(domText ); //添加子节点
QDomNode
spanNodeNew = spanNode.cloneNode(true); //克隆节点
domDocument.toString();
//转为字符串
Demo程序下载:
http://download.csdn.net/detail/lingyun0/8202105
参考资料: http://inotgaoshou.iteye.com/blog/1012188 java解析xml的几种方式
by
Lankin.
DOM分析器把整个XML文档转化成DOM树放在内存中,应用程序可以在任何时候访问XML文档中的任何一部分数据(随机访问)。这种方式对内存的要求较高,文档结构较复杂时比较耗效率。
SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数(事件驱动)。应用程序通过这些事件处理函数实现对XML文档的访问。
基于Qt的xml解析,实际可以通过三种方式,dom、sax,以及Qt的QXmlReader.简单的xml解析,可以采用QDomDocument,方便,且灵活性大。在此主要介绍dom方式的解析。
相关的类主要有QDomDocument,QDomNode,QDomElement。QDomNode是所有Dom
Tree相关类的基类。
相关的方法:
QDomcument::setContent(),设置需要解析的内容(可以是字符串,设备等)
QDomcument::firstChildElement();
查找某个子元素,返回查找到的子元素(QDomElement,isNull时未找到)。
QDomNdoe::toElement();//转为dom元素(返回QDomElement,具有名称,零个或多个属性)
QDomNode::nodeName(); //节点名称
QDomElement::childNodes();//子节点列表
QDomElement::tagName();//名称
QDomElement::text();//文本
QDomElemnt::attribute();//属性
上代码:
//html解析 void DomXmlParser::testParseXml(const QString &strXml) { /*xml样例: *<html> <body> <p><span style="class_Hello">你好!</span> <span>Hello World!</span> </p> <p><span style="class_Hello">你也好。</span> <img src="test.png"/> </p> </body> </html> */ QString strDemoText = strHtml; //需要解析的字符串 QDomDocument domDocument; //文档模型 domDocument.setContent(strDemoText); QDomElement bodyElement = domDocument.firstChildElement("html").firstChildElement("body"); //body节点 QDomNodeList paraNodeList = bodyElement.childNodes(); //p节点列表 if(0 == paraNodeList.count()) //获取的p节点列表为空 { qDebug() << "未获取到p节点"; } else //成功获取到p节点 { for(int nParaIndex=0; nParaIndex<paraNodeList.count(); nParaIndex++)//遍历p节点 { QDomNode paraNode = paraNodeList.at(nParaIndex); //p节点 QDomNodeList spanNodeList = paraNode.childNodes();//span节点或img节点列表 for(int nSpanIndex=0; nSpanIndex<spanNodeList.count(); nSpanIndex++)//遍历span节点或img节点 { QDomNode spanNode = spanNodeList.at(nSpanIndex);//span节点或img节点 if("span" == spanNode.nodeName()) //根据节点名称判断是否是span节点 { QString strNodeText = spanNode.toElement().text();//节点中的文本 QString strNodeStyle = spanNode.toElement().attribute("style");//style属性 qDebug() << "span节点,text=" << strNodeText << "style=" << strNodeStyle; } else if("img" == spanNode.nodeName()) { QString strSrc = spanNode.toElement().attribute("src"); qDebug() << "img节点,src=" << strSrc; } }/*end of for(遍历span节点)*/ }/*end of for(遍历p节点)*/ }/*end of if(0==...)-else*/ }
输出结果为:
span节点,text= "你好!" style= "class_Hello"
span节点,text= "Hello World!" style= ""
span节点,text= "你也好。" style= "class_Hello"
img节点,src= "test.png"
示例程序地址:http://download.csdn.net/detail/lingyun0/8202105
还可以进行创建节点等操作,具体可查Qt文档,例如:
QDomElement
elementParaForAdd = domDocument.createElement("p"); //建立一个p节点
spanElement.setAttribute("style",strSpanStyle);
//设置span节点的样式
QDomText domText = docMessageHtml.createTextNode("你好,你好。");//创建文本节点
spanElement.appendChild(domText ); //添加子节点
QDomNode
spanNodeNew = spanNode.cloneNode(true); //克隆节点
domDocument.toString();
//转为字符串
Demo程序下载:
http://download.csdn.net/detail/lingyun0/8202105
参考资料: http://inotgaoshou.iteye.com/blog/1012188 java解析xml的几种方式
by
Lankin.
相关文章推荐
- QT中基于流的XML解析
- QT 下载文件解析XML
- 基于Qt的FreeType字体轮廓解析
- Qt编程5:使用QXmlStreamReader解析xml(简单应用)
- JAXP解析XML(基于DOM模型)
- XPathReader------基于XPath的XML解析方式
- Qt中解析xml
- 基于pugixml开源解析库的XML文档构建和解析
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
- QT中使用QXmlStreamReader解析XML文件
- qt 解析XML
- qt xml 解析
- 基于jdk的2种xml解析方式的比较
- MyXML源码分析系列:我自己写的一个XML解析-基于状态图
- StAX-基于流的拉式XML解析
- “基于MFC的第三方XML解析和生成API-------CMarkup类”的一个必须要注意的地方
- 基于Dom 的解析xml 工具类 XmlManager
- java编程练习:基于XML配置文件,解析,反射,运行程序
- Qt解析xml
- 一个基于XML的传输协议解析