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 :

Parser un doc XML (DOM) sans connaissances a priori


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut Parser un doc XML (DOM) sans connaissances a priori
    Bonjour,

    Je tente de parser un document XML avec la lib QtXml, notamment avec la méthode DOM. Pour ce faire je me suis très fortement inspiré de ce tutoriel et plus particulièrement du chapitre "Reading Using DOM".
    Mais voilà, il faut déjà connaitre le nom des noeuds (tagName) ou des attributs (attribute) que l'on veut lire !!

    Mon objectif est de parser un doc XML sans connaissances a priori sur ce que je vais trouver dedans (mis à part une architecture définie). Y a-t-il un moyen de faire ça avec la classe QtXml ?

    Merci pour vos réponses.

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Si vous souhaitez utiliser la méthode DOM, vous pouvez parcourir récursivement avec QDomDocument et QDomElement via firstChild() et nextSibling(), ne connaissant donc pas au préalable la structure du XML.

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    Merci Amnell pour votre réponse,

    Je n'ai pas dû être assez clair, du coup je vais essayer de reformuler mon besoin:

    Ce que je souhaite récupérer c'est les noms des balises, par exemple :
    Fichier 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <window>
       <name id="Fenêtre 1" width="50" height="25" posX="20" posY="65" />
      <name id="Fenêtre 2" width="50" height="25" posX="40" posY="65" />
      <name id="Fenêtre 3" width="50" height="25" posX="20" posY="90" />
      <name id="Fenêtre 4" width="50" height="25" posX="40" posY="90" />
    </window>
    Fichier 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <Alert>
       <width_alert_win value="55" />
       <height_alert_win value="15" />
      <isVisible value="true" />
      <layout val1="4" val2="5" val3="1" />
     </Alert>
    Le parser doit pouvoir récupérer tout seul les infos suivantes:
    Fic1:
    window,
    name id ("Fenêtre 1") width("50") height("25") posX("20") posY("65")
    ...

    Fic2:
    Alert
    width_alert_win value("55")
    height_alert_win value("15")
    IsVisible value("true")
    layout val1("4") val2("5") val3("1")

    Or si je comprend bien les méthodes firstChild() et nextSibling() permettent uniquement de passer de node en node, et de récupérer les attributs que si l'on connait le nom des balise !!!

    Il n'existent pas de méthode du style getNodeName qui fournirait : window et Alert
    ni de méthode getTagName qui fournirait : name (4 fois), width_alert_win, height_alert_win, IsVisible, Layout


    Si vous avez une méthode pour récupérer les infos précédent, je suis plus que preneur.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Par défaut
    Bonjour,

    Pour récupérer le nom des nodes, un QDomElement::tagName devrait faire l'affaire :
    QString QDomElement::tagName () const

    Returns the tag name of this element. For an XML element like this:

    <img src="myimg.png">
    the tagname would return "img".

    Ensuite pour récupérer les noms d'attributs j'ai trouvé ça :
    http://stackoverflow.com/questions/3...xml-node-in-qt

    Une fois ces noms récupérés un QString QDomElement::attribute devrait pouvoir te retourner les valeurs de ces attributs.

    A +

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    Merci beaucoup dwarfylo je vais tester tout ça et je reviens !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    Voici le code d'un parser de fichier XML (main.xml) sans aucune connaissance a priori; je l'ai testé chez moi, ça marche, mais il y a surement des trucs à améliorer...

    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
    79
    80
    81
    82
    83
    	// Objectives: Open xml file then create DOM doc
    	QString nameFileXml = "main.xml";
     
    	QDomDocument doc( "totoML" ); // Creation of DOM document
    	QFile file(nameFileXml );
    	if( !file.open( QIODevice::ReadOnly ) )
      		return -1;
     
    	if( !doc.setContent( &file ) )
    	{
      		file.close();
      		return -2;
    	}
    	file.close();
     
    	// Defined ROOT
    	QDomElement root = doc.documentElement();
    //	if( root.tagName() != "xmldoc" )
    //		return -3;
     
    	// Parse doc	
    	domNode = root.firstChild();
    	pt_domDoc = &domNode; 
    	QDomNode *pt_node;
    	int ii = 0, jj = 0;
    	while( !pt_domDoc->isNull() )
    	{
    		ii++;		
    		// Transform a QDomNode to a QDomElement - It means to go deeper in structure
    		QDomElement e = pt_domDoc->toElement();
    		if( !e.isNull() )
    		{
    			qDebug() << e.tagName();
    			// Verification of attributes			
    			QDomNamedNodeMap nodeMap = e.attributes();
    			if (nodeMap.length() != 0)
    			{
    				int nbAttr = nodeMap.length();
    				while (nbAttr > 0)
    				{
    					nbAttr--;
    					// Transform the QDomNamedNodeMap in QDomNode
    					QDomNode attrNode = nodeMap.item(nbAttr);
    					// Transform the QDomNode to QDomAttr
    					QDomAttr attr = attrNode.toAttr();
    					// Obtain attribute name (at last) in QString and value in Qstring
    					QString attrName = attr.name();
    					qDebug() << "Attribute name: " << attrName << " - Value: " << attr.value();
     
    					// Obtain attribute value
     
    				}
    			}
     
    			// Verification of child nodes
    			if (e.hasChildNodes())
    			{
    				// Enter in Child node : Convert a QDomElement in QDomMode
    				*pt_domDoc = e.firstChild();
    			}
    			else
    			{
    				// 2 choices: Go to the next node or go to the parents node
    				QDomNode nxNode = e.nextSibling();
    				if (nxNode.isNull())
    				{
    					// Next node do NOT exist, go to the parents node
    					// Use QDomNode to get the parents node
    					*pt_domDoc = pt_domDoc->parentNode();
    					if (!pt_domDoc->isNull())
    					{
    						// Increment parent's node
    						*pt_domDoc = pt_domDoc->nextSibling();
    					}
    				} 
    				else
    				{
    					// Continue While
    					*pt_domDoc = nxNode;
    				}
    			}
    		}
    	}

    ==> RESOLU, merci dwarfylo

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/05/2009, 09h43
  2. [DOM4J] Parser un document XML avec DOM
    Par kroax dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 23/11/2007, 01h48
  3. Parser un fichier XML avec DOM
    Par Bayard dans le forum Général Python
    Réponses: 1
    Dernier message: 02/11/2007, 20h44
  4. parser un fichier xml avec dom
    Par cilies38 dans le forum Modules
    Réponses: 2
    Dernier message: 04/03/2007, 21h12
  5. Traitement d'images: prédiction sans connaissance a priori
    Par progfou dans le forum Traitement d'images
    Réponses: 5
    Dernier message: 30/10/2006, 08h52

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