2011-03-18 4 views
0

J'essaie de lire du texte dans une balise XML. J'utilise la fonction readelementtext() mais elle renvoie une Qstring vide. Le code que j'utilise est le suivant.QXmlstreamreader trouble

#include <QCoreApplication> 
#include <QFile> 
#include <QStringList> 
#include <QTextStream> 
#include <QXmlStreamReader> 
#include <QXmlStreamWriter> 
#include <QByteArray> 
#include <iostream> 
#include <ostream> 
#include <QString> 

class XmlStreamLint 
{ 
public: 
    Q_DECLARE_TR_FUNCTIONS(XmlStreamLint) 
}; 

int main(int argc, char *argv[]) 
{ 
    enum ExitCode 
    { 
     Success, 
     ParseFailure, 
     ArgumentError, 
     WriteError, 
     FileFailure 
    }; 

    QCoreApplication app(argc, argv); 

    QTextStream errorStream(stderr); 

    if (argc != 2) 
    { 
     errorStream << XmlStreamLint::tr(
         "Usage: xmlstreamlint <path to XML file>\n"); 
     return ArgumentError; 
    } 

    QString inputFilePath(QCoreApplication::arguments().at(1)); 
    QFile inputFile(inputFilePath); 

    if (!QFile::exists(inputFilePath)) 
    { 
     errorStream << XmlStreamLint::tr(
         "File %1 does not exist.\n").arg(inputFilePath); 
     return FileFailure; 

    } else if (!inputFile.open(QIODevice::ReadOnly|QIODevice::Text)) { 
     errorStream << XmlStreamLint::tr(
         "Failed to open file %1.\n").arg(inputFilePath); 
     return FileFailure; 
    } 
    QString outputfilepath="/home/shakeel/xmlstreamlint/testing.xml"; 
    QFile outputFile(outputfilepath); 
    //QFile outputFile; 
    if (!outputFile.open(stdout, QIODevice::WriteOnly)) 
    { 
     errorStream << XmlStreamLint::tr("Failed to open stdout."); 
     return WriteError; 
    } 
    QByteArray array[20000]; 
    QByteArray *ptr; 
    ptr=&array[0]; 
    QXmlStreamReader reader(&inputFile); 
    //QXmlStreamWriter writer(&outputFile); 
    QXmlStreamWriter writer(ptr); 
    QString text,signal; 
    int count=0; 
    while (!reader.atEnd()) 
    { 
     reader.readNext(); 

     if (reader.error()) 
     { 
      errorStream << XmlStreamLint::tr(
          "Error: %1 in file %2 at line %3, column %4.\n").arg(
           reader.errorString(), inputFilePath, 
           QString::number(reader.lineNumber()), 
           QString::number(reader.columnNumber())); 
      return ParseFailure; 

     } else 
      if (reader.isStartElement()) 
      { 
       text = reader.name().toString(); 
       if(text.operator ==("TYPICAL_CYCLE_CHANNEL")) 
       { 
          count=count+1; 
          signal=reader.readElementText(); 
          writer.writeCurrentToken(reader); 

Le code XML que j'essaie de lire est le suivant;

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE ECG SYSTEM "mortara.dtd"> 
<!-- Generated by Mortara ELI Link 2.20 --> 
<!-- Mortara Instrument, Inc. --> 
<!-- Server Name - Unknown --> 
    <ECG 
    ACQUISITION_TIME="20070227033111" 
    ROOM="" 
    LOCATION="" 
    COMMENT="" 
    AGE="59" 
    AGE_UNITS="Y" 
    HEIGHT="" 
    HEIGHT_UNITS="I" 
    WEIGHT="" 
    WEIGHT_UNITS="L" 
    NUM_QRS="10" 
    AVERAGE_RR="935" 
    VENT_RATE="64" 
    SEQUENCE_NUMBER="6" 
    > 
    <DEMOGRAPHIC_FIELD ID="1" LABEL="Name:" VALUE="Asd" UNITS="" /> 
    <DEMOGRAPHIC_FIELD ID="7" LABEL="FName:&amp;," VALUE="We" UNITS="" /> 
    <DEMOGRAPHIC_FIELD ID="2" LABEL="ID&amp;ID:" VALUE="12" UNITS="" /> 
    <DEMOGRAPHIC_FIELD ID="16" LABEL="DOB:" VALUE="12/13/47" UNITS="" /> 
    <DEMOGRAPHIC_FIELD ID="3" LABEL="Age&amp;yr" VALUE="59" UNITS="Y" /> 
    <DEMOGRAPHIC_FIELD ID="4" LABEL="Sex" VALUE="Male" UNITS="" /> 
    <SITE 
    ID="0" 
    /> 
    <SUBJECT 
    LAST_NAME="Asd" 
    FIRST_NAME="We" 
    GENDER="Male" 
    ID="12" 
    /> 
    <SOURCE 
    TYPE="RESTING" 
    MANUFACTURER="Mortara Instrument, Inc." 
    MANUFACTURER_ID="10" 
    MODEL="el250" 
    ID="4" 
    TRANSMISSION_TIME="20070414092347" 
    /> 
    <AUTOMATIC_INTERPRETATION> 
     <STATEMENT 
     STATEMENT_NUMBER="1" 
     TEXT="SINUS RHYTHM WITH SHORT PR INTERVAL" 
     REASON="" 
     /> 
     <STATEMENT 
     STATEMENT_NUMBER="2" 
     TEXT="TYPE A WOLFF-PARKINSON-WHITE PATTERN" 
     REASON="" 
     /> 
     <STATEMENT 
     STATEMENT_NUMBER="3" 
     TEXT="NO FURTHER INTERPRETATION POSSIBLE" 
     REASON="" 
     /> 
     <STATEMENT 
     STATEMENT_NUMBER="4" 
     TEXT="ATYPICAL ECG" 
     REASON="" 
     /> 
     <STATEMENT 
     STATEMENT_NUMBER="5" 
     TEXT="" 
     REASON="" 
     /> 
     <STATEMENT 
     STATEMENT_NUMBER="6" 
     TEXT="UNCONFIRMED REPORT" 
     REASON="" 
     /> 
    </AUTOMATIC_INTERPRETATION> 
    <TYPICAL_CYCLE 
    R_PEAK="500" 
    P_ONSET="-185" 
    P_OFFSET="-116" 
    Q_ONSET="-87" 
    Q_OFFSET="75" 
    T_OFFSET="369" 
    P_DURATION="69" 
    PR_DURATION="98" 
    QRS_DURATION="162" 
    QT="456" 
    QTC="465" 
    QTCB="471" 
    QTCF="466" 
    P_AXIS="17" 
    QRS_AXIS="-54" 
    T_AXIS="108" 
    BITS="16" 
    FORMAT="SIGNED" 
    UNITS_PER_MV="400" 
    DURATION="1200" 
    SAMPLE_FREQ="1000" 
    ENCODING="BASE64" 
    > 
    <TYPICAL_CYCLE_CHANNEL 
    NAME="I" 
    DATA="BQAAAP7/AAAAAP7/AAACAAIAAgAAAP7//v/+/wAA/v8AAAIAAAAAAAIA/v/+ 
/wAAAAAAAAAAAAD+/wAAAAD7//v/AgACAAAA/v/+//v/+f/5//v/+f/7/wAA 
AgACAP7/+//5//b/9P/0/wAA+/8AAAAA/v/7//T/8f/5//n//v/7//7/AgAA 
AP7/AAD5//n//v/5//v/AAD7//n/AAAAAPv/+//7//7//v/5//v/+f/5//v/ 
+f/5//v/AAD7//n/+f/5//n/9v/2//T/+f/5//v/9v/+//n/+f/5//n/+f/+ 
//n/+f/5//n//v8AAPv/+f/7//n/+f/2//T//v/5//b/9v/0//v//v/5//b/ 
9v/0//T/9P/x//H/9P/7//7//v/2//n/+//5//n/9P/5//n/+//x//T/7//0 
//b/8f/2//n/+//7/wAA9v/2//H/9P/0//T/7//x//n/9v/7/wAA+//5//b/ 
9v/2//b/9v/v//H/9v/0//n/+f/2//T/7//x//b/9v/0//b/+f/x//H/8f/0 
//T/8f/5//n/9v/5//n/9v/2//b/+f/2//b/9v/+//n/9P/s//H/9P/2//H/ 
7//x//b/9v/0//T/9v/5//b/9P/2//T/+//+//H/7P/q/+//9P/v//H/9v/x 
//H/9P/0//b/9v/5//T/+f/2//v/+//2//T/9P/2//b/9v/x//T/9v/2//H/ 
9P/5//b/8f/0//T/9v/0//H/7P/s/+z/9P/5//v/9v/5//b/9P/x/+//9v/x 
//T/9v/2//T/9v/2//T/9P/0/+//8f/x//b/9P/x/+//8f/0//T/+f/+//v/ 
9v/0//v/AAD7//T/9v/5//v/+f/+/wIAAAD7//n//v/7/wIAAgAAAP7/AAAH 
AAUAAAACAAcABwAUAAwAAgAAAP7/AAAKAAIABwAFAAcACgAPAAoADAARAAwA 
CgAKAAwACgARAAwAEQARAA8ACgAKAAoACgARAAoACgAFAAcABwAAAAIABwAK 
AAcABwAHAAUAAgAFAAIAAgAFAAUACgAKAAwACgAKAAwABwAFAAIABQACAAIA 
AgAHAAIAAAAAAAAA+//7/wAA/v/+//7/AAAFAAAAAAAFAAIABQAKAAoAFAAW 
ABkAGwAeACAAKAAtADQAPABDAE0AVQBQAFIAVQBVAFoAVwBSAFoAYQBkAGQA 
ZABrAHAAbgBwAHMAdQB6AIIAhwCMAI4AlgCgAKUArACxALkAuwDAAMgAzQDU 
ANwA3ADmAOsA9QD8AAEBAQEJARUBIgEsATsBRwFRAWABcgGBAZUBrgG/Ac4B 
7AEAAhkCKwI3AksCXQJkAmwCbgJuAnYCewJ2AnMCbgJpAmcCXQJVAkYCPAIr 
Ag8C9gHlAdsBxwGwAZoBgQFoAVEBQAEpARgBBgH3AOMAzQC5AKoAnQCMAHoA 
ZABXAEgAQQA5AC0ALQAlACAAIAAbABsAFgAWAAIAAgAAAAcAAgD5//H/9P/x 
//H/9v/v//b/8f/v/+z/6v/s//H/9v/0//H/6v/0//T/8f/v/+r/7P/s/+f/ 
5f/q/+r/7P/q/+r/5//q/+//7P/l/+X/5f/q/+X/2//g/+X/5//l/+L/4P/g 
/+r/7P/s/+f/5f/l/+X/5f/l/+f/6v/l/+X/5f/q/+z/6v/s/+r/5//n/+X/ 
3f/i/+D/5f/l/+X/5f/n/+f/4P/g/+D/5f/l/+L/5f/l/+X/5f/l/+L/4v/i 
/+X/4v/n/+L/5f/n/+X/4P/g/+X/5f/g/+L/5f/i/+L/3f/g/93/4P/l/+X/ 
3f/g/+D/3f/g/+D/4P/l/+f/5f/g/+X/4v/g/9v/2//b/+L/5f/i/9v/2//d 
/93/3f/b/9 
+0

J'ai essayé de formater votre code (il sera visible si elle est approuvée par les modérateurs), mais même alors, votre code Qt et le document XML sont incomplets. Si vous êtes en mesure de fournir un code plus complet et Xml, vous pourriez obtenir des réponses. –

Répondre

0

Dave Permettez-moi repostez le code et l'échantillon xml. J'ai supprimé l'erreur en saisissant les conditions.

QString inputFilePath(QCoreApplication::arguments().at(1)); 
QFile inputFile(inputFilePath); 
QString outputfilepath="/home/shakeel/xmlstreamlint/testing.xml"; 
QFile outputFile(outputfilepath); 
QByteArray array[2000]; 
QByteArray *ptr; 
ptr=&array[0]; 
QXmlStreamReader reader(&inputFile); 
QXmlStreamWriter writer(ptr); 
QString text,signal; 
while (!reader.atEnd()) 
{ 
    reader.readNext(); 
    } else 
     if (reader.isStartElement()) 
     { 
      text = reader.name().toString(); 
      if(text.operator ==("TYPICAL_CYCLE_CHANNEL")) 
      { 
      signal=reader.readElementtext(); 
      } 
     } 
     writer.writeCurrentToken(reader);  

}

0

Il suffit d'ajouter la fermeture accolades xml est complète Voir si cela aide Cordialement