加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML文件处理

发布时间:2020-12-16 09:31:25 所属栏目:百科 来源:网络整理
导读:Qt 的 XML 模块包含了两种处理 xml 的 API ,分别是 SAX 和 DOM 。 SAX 提供了一种低层的基于事件驱动的方式解析 xml 文件,而 DOM 提供了一种高层的接口用于解析 xml 文件。不同之处在于 DOM 受制于内存的大小,一次不能解析文件大小太大的 xml 文件,因为

QtXML模块包含了两种处理xmlAPI,分别是SAXDOMSAX提供了一种低层的基于事件驱动的方式解析xml文件,而DOM提供了一种高层的接口用于解析xml文件。不同之处在于DOM受制于内存的大小,一次不能解析文件大小太大的xml文件,因为它将xml文件一次性地读入内存中。

SAX方式解析XML文件

SAX方式解析XML是基于事件方式编程的。执行的流程完全取决于读入的数据。使用该方式的主要步骤是创建一个XML读取器以及一个处理器,然后将两者关联起来,之后调用parse(),涉及的各方用类图表示如下:


代码示例如下:

myhandler.h

[cpp] view plain copy
  1. #ifndefMYHANDLER_H
  2. #defineMYHANDLER_H
  3. #include<QXmlDefaultHandler>
  4. classQString;
  5. classMyHandler:publicQXmlDefaultHandler
  6. {
  7. public:
  8. explicitMyHandler();
  9. signals:
  10. publicslots:
  11. boolstartDocument();
  12. boolstartElement(constQString&namespaceURI,
  13. constQString&localName,
  14. constQString&qName,153); background-color:inherit; font-weight:bold">constQXmlAttributes&atts);
  15. boolcharacters(constQString&text);
  16. boolendElement(constQString&qName);
  17. private:
  18. QStringindent;
  19. };
  20. #endif//MYHANDLER_H

myhandler.cpp

copy
    #include"myhandler.h"
  1. #include<QObject>
  2. #include<QTextStream>
  3. #include<QDebug>
  4. MyHandler::MyHandler():QXmlDefaultHandler()
  5. }
  6. boolMyHandler::startDocument(){
  7. indent="";
  8. returnTRUE;
  9. boolMyHandler::characters(constQString&text){
  10. QStringt=text;
  11. qDebug()<<t.remove('n');
  12. returnTRUE;
  13. }
  14. boolMyHandler::startElement(constQString&,153); background-color:inherit; font-weight:bold">constQXmlAttributes&atts){
  15. QStringstr=QString("n%1%2").arg(indent).arg(qName);
  16. qDebug()<<str;
  17. if(atts.length()>0){
  18. QStringfieldName=atts.qName(0);
  19. QStringfieldValue=atts.value(0);
  20. qDebug()<<QString("(%2=%3)").arg(fieldName).arg(fieldValue);
  21. qDebug()<<"{";
  22. indent+="";
  23. boolMyHandler::endElement(constQString&){
  24. indent.remove(0,4);
  25. qDebug()<<"}";
  26. }

main.cpp

copy
    #include<QApplication>
  1. #include<QFile>
  2. #include<QXmlInputSource>
  3. #include"myhandler.h"
  4. #include<QDebug>
  5. intmain(intargc,char*argv[])
  6. {
  7. QApplicationa(argc,argv);
  8. QFilexmlFile(":/test.xml");
  9. QXmlInputSourcesource(&xmlFile);
  10. if(!xmlFile.open(QFile::ReadOnly|QFile::Text)){
  11. return-1;
  12. MyHandlerhandler;
  13. QXmlSimpleReaderreader;
  14. reader.setContentHandler(&handler);
  15. if(reader.parse(source))
  16. qDebug()<<"Fileloaded!";
  17. returna.exec();
  18. DOM方式解析DOM方式只适合解析小的xml文件,它是基于SAX之上的一种高层解析XML方法。使用方式见如下代码所示:

    copy
      #include<QtCore/QCoreApplication>
    1. #include<QDomDocument>
    2. #include<QFile>
    3. voidparseFolderElement(constQDomElement&element)
    4. QDomElementchild=element.firstChildElement();
    5. while(!child.isNull()){
    6. if(child.tagName()=="folder"){
    7. parseFolderElement(child);
    8. }elseif(child.tagName()=="bookmark"){
    9. QStringtitle=child.firstChildElement("title").text();
    10. if(title.isEmpty())
    11. title=QObject::tr("Folder");
    12. qDebug()<<"title="<<title;
    13. }if(child.tagName()=="separator"){
    14. qDebug()<<"processingseparator";
    15. child=child.nextSiblingElement();
    16. voidparseXmlByDom(QIODevice*device)
    17. QDomDocumentdomDocument;
    18. QStringerrorStr;
    19. interrorLine;
    20. interrorColumn;
    21. if(!domDocument.setContent(device,true,&errorStr,&errorLine,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> &errorColumn)){
    22. qDebug()<<"Parseerroratline"
    23. <<errorLine
    24. <<",column"
    25. <<errorColumn
    26. <<":n"
    27. <<errorStr;
    28. return;
    29. QDomElementroot=domDocument.documentElement();
    30. if(root.tagName()!="xbel"){
    31. qDebug()<<QString("ThefileisnotanXBELfile.");
    32. return;
    33. if(root.hasAttribute("version")
    34. &&root.attribute("version")!="1.0"){
    35. qDebug()<<QString("ThefileisnotanXBELversion1.0file.");
    36. QDomElementchild=root.firstChildElement("folder");
    37. parseFolderElement(child);
    38. child=child.nextSiblingElement("folder");
    39. char*argv[])
    40. QCoreApplicationa(argc,argv);
    41. QFilef("frank.xbel");
    42. if(!f.open(QIODevice::ReadOnly))
    43. qDebug()<<"failedtoopenfile";
    44. parseXmlByDom(&f);
    45. }

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读