Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3098|回复: 0
打印 上一主题 下一主题

基于Qt的xml解析 html解析

[复制链接]

437

主题

566

帖子

2381

积分

金牌会员

Rank: 6Rank: 6

积分
2381
跳转到指定楼层
楼主
发表于 2016-12-13 12:40:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
http://blog.csdn.net/lankin2013/article/details/41523065

基于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();//属性

  1. //html解析
  2. void DomXmlParser::testParseXml(const QString &strXml)
  3. {
  4.     /*xml样例:
  5.      *<html>
  6.         <body>
  7.             <p><span style="class_Hello">你好!</span> <span>Hello World!</span> </p>
  8.             <p><span style="class_Hello">你也好。</span> <img src="test.png"/> </p>
  9.         </body>
  10.     </html>
  11.      */
  12.     QString strDemoText = strHtml; //需要解析的字符串
  13.     QDomDocument domDocument; //文档模型
  14.     domDocument.setContent(strDemoText);
  15.     QDomElement bodyElement = domDocument.firstChildElement("html").firstChildElement("body"); //body节点
  16.     QDomNodeList paraNodeList = bodyElement.childNodes(); //p节点列表
  17.     if(0 == paraNodeList.count()) //获取的p节点列表为空
  18.     {
  19.         qDebug() << "未获取到p节点";
  20.     }
  21.     else //成功获取到p节点
  22.     {
  23.         for(int nParaIndex=0; nParaIndex<paraNodeList.count(); nParaIndex++)//遍历p节点
  24.         {
  25.             QDomNode paraNode = paraNodeList.at(nParaIndex); //p节点
  26.             QDomNodeList spanNodeList = paraNode.childNodes();//span节点或img节点列表
  27.             for(int nSpanIndex=0; nSpanIndex<spanNodeList.count(); nSpanIndex++)//遍历span节点或img节点
  28.             {
  29.                 QDomNode spanNode = spanNodeList.at(nSpanIndex);//span节点或img节点
  30.                 if("span" == spanNode.nodeName()) //根据节点名称判断是否是span节点
  31.                 {
  32.                     QString strNodeText = spanNode.toElement().text();//节点中的文本
  33.                     QString strNodeStyle = spanNode.toElement().attribute("style");//style属性
  34.                     qDebug() << "span节点,text=" << strNodeText << "style=" << strNodeStyle;
  35.                 }
  36.                 else if("img" == spanNode.nodeName())
  37.                 {
  38.                     QString strSrc = spanNode.toElement().attribute("src");
  39.                     qDebug() << "img节点,src=" << strSrc;
  40.                 }

  41.             }/*end of for(遍历span节点)*/

  42.         }/*end of for(遍历p节点)*/

  43.     }/*end of if(0==...)-else*/
  44. }
复制代码
输出结果为:
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://inotgaoshou.iteye.com/blog/1012188    java解析xml的几种方式
by Lankin.

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-25 22:53 , Processed in 0.059299 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表