XML文件处理

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

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

SAX方式解析XML文件

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


代码示例如下:

myhandler.h

  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=@H_394_404@"";
  8. returnTRUE;
  9. boolMyHandler::characters(constQString&text){
  10. QStringt=text;
  11. qDebug()<<t.remove(@H_394_404@'\n');
  12. returnTRUE;
  13. }
  14. boolMyHandler::startElement(constQString&,153); background-color:inherit; font-weight:bold">constQXmlAttributes&atts){
  15. QStringstr=QString(@H_394_404@"\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(@H_394_404@"(%2=%3)").arg(fieldName).arg(fieldValue);
  21. qDebug()<<@H_394_404@"{";
  22. indent+=@H_394_404@"";
  23. boolMyHandler::endElement(constQString&){
  24. indent.remove(0,4);
  25. qDebug()<<@H_394_404@"}";
  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(@H_394_404@":/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()<<@H_394_404@"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()==@H_394_404@"folder"){
  7. parseFolderElement(child);
  8. }elseif(child.tagName()==@H_394_404@"bookmark"){
  9. QStringtitle=child.firstChildElement(@H_394_404@"title").text();
  10. if(title.isEmpty())
  11. title=QObject::tr(@H_394_404@"Folder");
  12. qDebug()<<@H_394_404@"title="<<title;
  13. }if(child.tagName()==@H_394_404@"separator"){
  14. qDebug()<<@H_394_404@"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()<<@H_394_404@"Parseerroratline"
  23. <<errorLine
  24. <<@H_394_404@",column"
  25. <<errorColumn
  26. <<@H_394_404@":\n"
  27. <<errorStr;
  28. return;
  29. QDomElementroot=domDocument.documentElement();
  30. if(root.tagName()!=@H_394_404@"xbel"){
  31. qDebug()<<QString(@H_394_404@"ThefileisnotanXBELfile.");
  32. return;
  33. if(root.hasAttribute(@H_394_404@"version")
  34. &&root.attribute(@H_394_404@"version")!=@H_394_404@"1.0"){
  35. qDebug()<<QString(@H_394_404@"ThefileisnotanXBELversion1.0file.");
  36. QDomElementchild=root.firstChildElement(@H_394_404@"folder");
  37. parseFolderElement(child);
  38. child=child.nextSiblingElement(@H_394_404@"folder");
  39. char*argv[])
  40. QCoreApplicationa(argc,argv);
  41. QFilef(@H_394_404@"frank.xbel");
  42. if(!f.open(QIODevice::ReadOnly))
  43. qDebug()<<@H_394_404@"Failedtoopenfile";
  44. parseXmlByDom(&f);
  45. }

猜你在找的XML相关文章