IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

[FAQ] Valeur non récupérée si en double dans Document


Sujet :

Qt

  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Par défaut [FAQ] Valeur non récupérée si en double dans Document
    Bonjour,

    Depuis pas mal de temps je bloque sur un lecteur XML qui doit récupérer seulement quelque infos d'un fichier xml, le but sera de les affiché dans un QLineEdit.

    Donc j'ai coder un lecteur avec QXmlStreamReader, mais celui-ci marche sauf que comme par hasard les valeur qui m'intéresse sont en double (voir document plus bas).

    Donc si la valeur est en double il efuse de la récupérer. Si elle est pas en double là aucun soucis il la récupère.

    Voici le code que j'ai fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    bool Informations::read(QIODevice *device)
    {
    	xml.setDevice(device);
     
    	if (xml.readNextStartElement()) {
    		if (xml.name() == "plist" && xml.attributes().value("version") == "1.0"){
    			readName();
    			readIdentifier();
    			readVersion();
    		}
    		else 
    			xml.raiseError(QObject::tr("Le fichier n'est pas un fichier plist version 1.0"));
    	}
    	return !xml.error();
    }
     
    void Informations::readName()
    {
    	qDebug() << "Entrée dans Informations::readName";
    	while (xml.readNextStartElement()) {
    		if (xml.name() == "key") {
    			QString cle = xml.readElementText();
    			if (cle == "CFBundleName") {
    				xml.readNextStartElement();
    				if (xml.name() == "string") {
    					QString str = xml.readElementText();
    					m_kextName = str;
    				}
    			}
    			else if (cle == "CFBundleExecutable"){
    				xml.readNextStartElement();
    				if (xml.name() == "string") {
    					QString str = xml.readElementText();
    					m_kextName = str;
    				}
    			}
     
    		}
    	}
    	qDebug() << "le nom est: " << m_kextName;
    }
     
    void Informations::readIdentifier()
    {
    	qDebug() << "Entrée dans Informations::readIdentifier";
    	while (xml.readNextStartElement()) {
    		if (xml.name() == "key") {
    			QString cle = xml.readElementText();
    			if (cle == "CFBundleIdentifier") {
    				xml.readNextStartElement();
    				if (xml.name() == "string") {
    					QString str = xml.readElementText();
    					m_kextIdentifier = str;
    					break;
    				}
    			}
    		}
    	}
    	qDebug() << "le nom est: " << m_kextIdentifier;
    }
     
    void Informations::readVersion()
    {
    	//qDebug() << "Entrée dans Informations::readVersion";
    	while (xml.readNextStartElement()) {
    		if (xml.name() == "key") {
    			QString cle = xml.readElementText();
    			if (cle == "CFBundleVersion") {
    				xml.readNextStartElement();
    				if (xml.name() == "string") {
    					QString str = xml.readElementText();
    					m_kextVersion = str;
    				}
    			}
    		}
    	}
    	//qDebug() << "le nom est: " << m_kextVersion;
    }
    Mon problème est de savoir comment dire a mon Lecteur XML pour chaque fonction, arrête de lire le document quand tu as la valeur ?

    Voici à quoi ressemble les fichier XML sur lesquel mon code travail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    	<key>CFBundleDevelopmentRegion</key>
    	<string>English</string>
    	<key>CFBundleInfoDictionaryVersion</key>
    	<string>6.0</string>
    	<key>CFBundleVersion</key>
    	<string>5.5.0</string>
    	<key>CFBundleShortVersionString</key>
    	<string>5.5.0</string>
    	<key>CFBundleName</key>
    	<string>UAD-1 Powered Plug-Ins</string>
    	<key>CFBundleGetInfoString</key>
    	<string>5.5.0 10-26-2009 16:20 
    © Universal Audio, Inc. 2001-09</string>
    	<key>CFBundlePackageType</key>
    	<string>KEXT</string>
    	<key>CFBundleSignature</key>
    	<string>UAD1</string>
    	<key>CFBundleExecutable</key>
    	<string>UADDriver</string>
    	<key>CFBundleIdentifier</key>
    	<string>com.uaudio.driver.HypKern</string>
    	<key>IOKitPersonalities</key>
    	<dict>
    		<key>UAD-1</key>
    		<dict>
    			<key>CFBundleIdentifier</key>
    			<string>com.uaudio.driver.HypKern</string>
    			<key>IOClass</key>
    			<string>com_uaudio_driver_HypKern</string>
    			<key>IONameMatch</key>
    			<array>
    				<string>pci110b,4</string>
    			</array>
    			<key>IOProviderClass</key>
    			<string>IOPCIDevice</string>
    		</dict>
    	</dict>
    	<key>OSBundleLibraries</key>
    	<dict>
    		<key>com.apple.kernel.mach</key>
    		<string>6.0</string>
    		<key>com.apple.kernel.bsd</key>
    		<string>6.0</string>
    		<key>com.apple.kernel.libkern</key>
    		<string>6.0</string>
    		<key>com.apple.kernel.iokit</key>
    		<string>6.0</string>
    		<key>com.apple.iokit.IOPCIFamily</key>
    		<string>1.4</string>
    		<key>com.uaudio.kext.HypAudio</key>
    		<string>5.5.0</string>
    	</dict>
    	<key>OSBundleProductName</key>
    	<string>UAD-1 Powered Plug-Ins</string>
    	<key>OSBundleProductURL</key>
    	<string>http://www.uaudio.com</string>
    </dict>
    </plist>
    PS : Je précise que j'ai lu la doc Qt sur QXmlStreamReader et aussi les tutoriels QT /FAQ QT et FAQ Xml sur le site.

    Mais nulle part je trouve un cas de figure semblable au miens.

    Pour rappel mon soucis est que mon Lecteur XML ne récupère plus la valeur si celle-ci à son double identique, sinon si son double est différent là sa marche.

    Merci

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    fait du pas à pas pour voir pourquoi. Ca doit pas être grand chose.
    Sinon, tu devrais regarder
    http://qt.developpez.com/doc/latest/qxmlquery.html
    qui te permettra de récupérer plus facilement une valeur dans le xml graçe à xpath.

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Par défaut
    Bonjour,

    Je répond tard car en ce moemnt je cherche un autre IDE que Xcode ou QtCreator sur Mac du coup j'ai entre autre dus compiler Qt puis la config qi est très difficile, bref du coup pas de Qt et d'IDE pour coder.

    Donc pour XPath je connais pas ce langage ou (je sais pas le nom), mais aussi en regardant j'ai peur de revenir à la même difficulté qui est que le KEY que je recherche n'est pas toujours pile poil au même endroit.

    Un coup sa peut être le premier un autre le 5 ème etc, ou peut être ais-je pas encore vraiment compris cette synthax.

    Mais il faudrai que je fasse un topics pour me faire aidé pour son utilisation.

    Sinon j'ai suivi aussi ton autre conseil, que j'avais fait, mais là du coup j'ai mis un qDebug à chaque ligne presque.

    Et du coup j'en suis arrivé ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    while (!reader.atEnd() )
            {
                if(reader.isStartElement())
                {
    				if(reader.name() == "key")
    				{
    					QString strKey = reader.readElementText();
    					qDebug() << trUtf8("Entrée dans key (Ligne 66)");
    					qDebug() << trUtf8("Key vaut: ") << strKey << ("Ligne 67");
    					reader.readNext();
    					while (reader.isStartElement() == false) {
    						reader.readNext();
    					}
    					if(strKey == keyName)
    					{
    					qDebug() << trUtf8("Ok entrée dans la condition de recherche la clef vaut: ") << keyName << ("Ligne 82");
    					while(reader.isStartElement() == false)
    						reader.readNext();
    						QString strNameString = reader.readElementText();
    						qDebug() << trUtf8("CFBundleName est égale à : (ligne: 90)") << strNameString;
    						// BREAK à vérifié en context
    						break;
    						//reader.readNext();
    					}
    				}
                }
                reader.readNext();
            }
            file.close();
    Et le résultat est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    "Entrée dans key (Ligne 66)" 
    "Key vaut: " "CFBundleDevelopmentRegion" Ligne 67 
    "Entrée dans key (Ligne 66)" 
    "Key vaut: " "CFBundleExecutable" Ligne 67 
    "Entrée dans key (Ligne 66)" 
    "Key vaut: " "CFBundleGetInfoString" Ligne 67 
    "Entrée dans key (Ligne 66)" 
    "Key vaut: " "CFBundleIdentifier" Ligne 67 
    "Entrée dans key (Ligne 66)" 
    "Key vaut: " "CFBundleInfoDictionaryVersion" Ligne 67 
    "Entrée dans key (Ligne 66)" 
    "Key vaut: " "CFBundleName" Ligne 67 
    "Ok entrée dans la condition de recherche la clef vaut: " "CFBundleName" Ligne 82 
    "CFBundleName est égale à : (ligne: 90)" "AppleRAID"
    Donc je me suis aussi appuyer sur la FAQ QtXml du site.

    Mais la boucle fais des lecture bizarre par moment.

    Donc c'est pour ça que j'ai entre autre mis un BREAK, pour dire que dés que j'ai ma valeur tu arrête de lire le document.

    Sa évitera sur les gros Info.plist de lire tous un fichier pour quelque info.

    Par contre je voudrais bien un avis sur ce que j'ai coder, puis-je partir la dessus ou on peut encore faire mieux.

    Merci.

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/10/2010, 15h11
  2. Réponses: 0
    Dernier message: 24/11/2008, 13h02
  3. nombre de valeurs non nulles dans une tables
    Par 080983 dans le forum SQL
    Réponses: 33
    Dernier message: 27/08/2007, 12h04
  4. [Cookies] Double nom et valeur non formatée
    Par nico33307 dans le forum Langage
    Réponses: 1
    Dernier message: 22/08/2007, 14h06
  5. Valeur non trouvé dans une requète SQL
    Par Jeankiki dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/12/2006, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo