XML文件处理

前端之家收集整理的这篇文章主要介绍了XML文件处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

SAX方式解析XML文件

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


代码示例如下:

myhandler.h

  1. @H_404_195@#ifndefMYHANDLER_H
  2. @H_404_195@#defineMYHANDLER_H
  3. @H_404_195@#include<QXmlDefaultHandler>
  4. @H_404_195@classQString;
  5. @H_404_195@classMyHandler:publicQXmlDefaultHandler
  6. @H_404_195@{
  7. public:
  8. explicitMyHandler();
  9. @H_404_195@signals:
  10. publicslots:
  11. @H_404_195@boolstartDocument();
  12. @H_404_195@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. @H_404_195@QStringindent;
  19. @H_404_195@};
  20. @H_404_195@#endif//MYHANDLER_H

myhandler.cpp

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

main.cpp

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

    copy
    @H_404_195@#include<QtCore/QCoreApplication>
  1. @H_404_195@#include<QDomDocument>
  2. @H_404_195@#include<QFile>
  3. voidparseFolderElement(constQDomElement&element)
  4. @H_404_195@QDomElementchild=element.firstChildElement();
  5. while(!child.isNull()){
  6. if(child.tagName()==@H_870_404@"folder"){
  7. @H_404_195@parseFolderElement(child);
  8. @H_404_195@}elseif(child.tagName()==@H_870_404@"bookmark"){
  9. @H_404_195@QStringtitle=child.firstChildElement(@H_870_404@"title").text();
  10. if(title.isEmpty())
  11. @H_404_195@title=QObject::tr(@H_870_404@"Folder");
  12. @H_404_195@qDebug()<<@H_870_404@"title="<<title;
  13. @H_404_195@}if(child.tagName()==@H_870_404@"separator"){
  14. @H_404_195@qDebug()<<@H_870_404@"processingseparator";
  15. @H_404_195@child=child.nextSiblingElement();
  16. voidparseXmlByDom(QIODevice*device)
  17. @H_404_195@QDomDocumentdomDocument;
  18. @H_404_195@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"> @H_404_195@&errorColumn)){
  22. @H_404_195@qDebug()<<@H_870_404@"Parseerroratline"
  23. @H_404_195@<<errorLine
  24. @H_404_195@<<@H_870_404@",column"
  25. @H_404_195@<<errorColumn
  26. @H_404_195@<<@H_870_404@":\n"
  27. @H_404_195@<<errorStr;
  28. return;
  29. @H_404_195@QDomElementroot=domDocument.documentElement();
  30. if(root.tagName()!=@H_870_404@"xbel"){
  31. @H_404_195@qDebug()<<QString(@H_870_404@"ThefileisnotanXBELfile.");
  32. return;
  33. if(root.hasAttribute(@H_870_404@"version")
  34. @H_404_195@&&root.attribute(@H_870_404@"version")!=@H_870_404@"1.0"){
  35. @H_404_195@qDebug()<<QString(@H_870_404@"ThefileisnotanXBELversion1.0file.");
  36. @H_404_195@QDomElementchild=root.firstChildElement(@H_870_404@"folder");
  37. @H_404_195@parseFolderElement(child);
  38. @H_404_195@child=child.nextSiblingElement(@H_870_404@"folder");
  39. char*argv[])
  40. @H_404_195@QCoreApplicationa(argc,argv);
  41. @H_404_195@QFilef(@H_870_404@"frank.xbel");
  42. if(!f.open(QIODevice::ReadOnly))
  43. @H_404_195@qDebug()<<@H_870_404@"Failedtoopenfile";
  44. @H_404_195@parseXmlByDom(&f);
  45. @H_404_195@}

猜你在找的XML相关文章