浏览代码

Use QXmlStreamReader instead of deprecated QXml module classes

Andreas Fetzer 10 年之前
父节点
当前提交
6c3f501abb

+ 2 - 10
Libs/XNAT/Core/ctkXnatAPI.cpp

@@ -32,9 +32,6 @@
 #if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
 #include <QUrlQuery>
 #endif
-#include <QXmlDefaultHandler>
-#include <QXmlInputSource>
-#include <QXmlSimpleReader>
 
 // --------------------------------------------------------------------------
 // ctkXnatAPI methods
@@ -117,18 +114,13 @@ void ctkXnatAPI::parseResponse(qRestResult* restResult, const QByteArray& respon
 // --------------------------------------------------------------------------
 QList<QVariantMap> ctkXnatAPI::parseXmlResponse(qRestResult* /*restResult*/, const QByteArray& response)
 {
-  QXmlInputSource xmlInput;
-  xmlInput.setData(response);
-  QXmlSimpleReader xmlReader;
-
   QList<QVariantMap> result;
   // In this case a resource catalog xml was requested
   if (response.contains("<cat:Catalog"))
   {
     ctkXnatResourceCatalogXmlParser parser;
-    xmlReader.setContentHandler(&parser);
-    xmlReader.parse(&xmlInput, true);
-    result = parser.md5Hashes();
+    parser.setData(response);
+    parser.parseXml(result);
   }
   return result;
 }

+ 26 - 24
Libs/XNAT/Core/ctkXnatResourceCatalogXmlParser.cpp

@@ -22,6 +22,7 @@
 #include "ctkXnatResourceCatalogXmlParser.h"
 
 #include <QDebug>
+#include <QXmlStreamReader>
 
 //----------------------------------------------------------------------------
 class ctkXnatResourceCatalogXmlParserPrivate
@@ -33,6 +34,7 @@ public:
   }
 
   QList<QVariantMap> result;
+  QXmlStreamReader xmlReader;
 };
 
 ctkXnatResourceCatalogXmlParser::ctkXnatResourceCatalogXmlParser()
@@ -44,39 +46,39 @@ ctkXnatResourceCatalogXmlParser::~ctkXnatResourceCatalogXmlParser()
   delete d_ptr;
 }
 
-bool ctkXnatResourceCatalogXmlParser::startElement(const QString &/*namespaceURI*/, const QString &localName,
-                                                   const QString &qName, const QXmlAttributes &atts)
+void ctkXnatResourceCatalogXmlParser::setData(const QByteArray &xmlInput)
 {
   Q_D(ctkXnatResourceCatalogXmlParser);
-  if (qName == "cat:entry")
+  d->xmlReader.addData(xmlInput);
+}
+
+void ctkXnatResourceCatalogXmlParser::parseXml(QList<QVariantMap>& result)
+{
+  Q_D(ctkXnatResourceCatalogXmlParser);
+
+  while (!d->xmlReader.atEnd())
   {
-    QString name("");
-    QString md5("");
-    QVariantMap map;
-    for( int i=0; i<atts.count(); i++ )
+    if (d->xmlReader.name().compare("entry") == 0)
     {
-      // TODO ID would be better
-      if( atts.localName(i) == "name")
-        name = atts.value(i);
+      QVariantMap map;
+      QXmlStreamAttributes attributes = d->xmlReader.attributes();
 
-      if( atts.localName( i ) == "digest" )
+      if( attributes.hasAttribute("name") && attributes.hasAttribute("digest"))
       {
-        md5 = atts.value(i);
+        QString name("");
+        name += attributes.value("name");
+        QString md5("");
+        md5 += attributes.value("digest");
+        map[name] = md5;
+        result.append(map);
       }
     }
-
-    if (name.length() == 0 || md5.length() == 0)
-    {
-      qWarning()<<"Error parsing XNAT resource catalog xml!";
-      return false;
-    }
-    else
-    {
-      map[name] = QVariant(md5);
-      d->result.append(map);
-    }
+    d->xmlReader.readNext();
+  }
+  if (d->xmlReader.hasError())
+  {
+    qWarning()<<"Error parsing XNAT resource catalog xml!";
   }
-  return true;
 }
 
 const QList<QVariantMap>& ctkXnatResourceCatalogXmlParser::md5Hashes()

+ 11 - 5
Libs/XNAT/Core/ctkXnatResourceCatalogXmlParser.h

@@ -24,7 +24,8 @@
 
 #include "ctkXNATCoreExport.h"
 
-#include <QXmlDefaultHandler>
+#include <QList>
+#include <QVariantMap>
 
 class ctkXnatResourceCatalogXmlParserPrivate;
 
@@ -40,7 +41,7 @@ class ctkXnatResourceCatalogXmlParserPrivate;
  *
  * @ingroup XNAT_Core
  */
-class CTK_XNAT_CORE_EXPORT ctkXnatResourceCatalogXmlParser : public QXmlDefaultHandler
+class CTK_XNAT_CORE_EXPORT ctkXnatResourceCatalogXmlParser
 {
 
 public:
@@ -48,10 +49,10 @@ public:
   ~ctkXnatResourceCatalogXmlParser();
 
   /**
-   * Overwrites QXmlDefaultHandler::startElement()
+   * @brief Set the xml input for the parser
+   * @param xmlInput as QByteArray
    */
-  bool startElement(const QString &namespaceURI, const QString &localName,
-                    const QString &qName, const QXmlAttributes &atts);
+  void setData(const QByteArray& xmlInput);
 
   /**
    * @brief Returns the md5 hashes of the resource files
@@ -59,6 +60,11 @@ public:
    */
   const QList<QVariantMap>& md5Hashes();
 
+  /**
+   * @brief Parses the xml input and extracts the md5 hashes of the resource catalog
+   * @param result the QList in which the md5 hashes will be stored
+   */
+  void parseXml(QList<QVariantMap> &result);
 private:
 
   ctkXnatResourceCatalogXmlParser(const ctkXnatResourceCatalogXmlParser& );