Farian | wizardman a écrit :
J'ai un petit soucis avec mon parser XML.
J'utilise QtXML sur cet extrait de la librairie iTunes (qui n'utilise pas vraiment XML de façon standard comme vous le remarquerez), ce qui me permet de pouvoir trouver la liste des albums iTunes toutes plateformes confondues sans passer par AppleScript.
J'ai modifié le nom de certains tags pour pouvoir les repérer dans la sortie.
La logique est la suivante : j'analyse tous les tags et leurs enfants (et leurs enfants, etc) jusqu'à trouver un <key> qui contient Album, auquel cas j'affiche le contenu du tag suivant qui contient le nom de l'album en question.
...
Je n'arrive pas à comprendre pourquoi il tourne en boucle, j'ai l'impression de faire tous les tests nécessaires pour ne séléctionner que ce que je cherche.
Des idées ?
|
Bonjour ! Plutôt que de continuer à chercher ce qui ne va pas dans votre code, je suis reparti d'un vieux code de parsing DOM que j'avais écrit il y a 10 ans (!) et que j'ai adapté pour l'occasion :
Code :
- void parse(const QDomElement& element)
- {
- for(QDomNode n = element.firstChild(); !n.isNull(); n = n.nextSibling())
- {
- QDomElement elementFils = n.toElement();
- if (!elementFils.isNull())
- {
- QString tagValue = elementFils.tagName();
- if (tagValue == "key" && elementFils.text() == "Album" )
- {
- qDebug() << n.nextSiblingElement().text();
- }
- parse(elementFils);
- }
- }
- }
|
qui est appelée ainsi :
Code :
- ...
- QDomElement docElem = doc.documentElement();
- // <plist> -> <dict>
- qDebug() << "Album list" ;
- qDebug() << "------------------------------------" ;
- parse(docElem);
- ...
|
Le résultat est satisfaisant :
Code :
- Album list
- ------------------------------------
- "J Dilla - Legacy Vol.1"
- "J Dilla - Legacy Vol.2"
|
(je ne m'explique pas les sauts de ligne ... et la flemme de chercher ou de tester en dehors de QtCreator )
Ensuite, j'ai tenté une approche plus ambitieuse, qui récupère pour chaque album toutes les infos dans une map (clé, valeur) :
Code :
- void parseAlbum(const QDomElement& element, QMap<QString, QString>& album)
- {
- QString cle;
- for(QDomNode n = element.firstChild(); !n.isNull(); n = n.nextSibling())
- {
- QDomElement elementFils = n.toElement();
- if (!elementFils.isNull())
- {
- QString tagValue = elementFils.tagName();
- if (elementFils.tagName().startsWith("key" ))
- {
- cle = elementFils.text();
- }
- else
- {
- album[cle] = elementFils.text();
- }
- }
- }
- }
- void parseAlbums(const QDomElement& element, QList<QMap<QString, QString> >& albums)
- {
- for(QDomNode n = element.firstChild(); !n.isNull(); n = n.nextSibling())
- {
- QDomElement elementFils = n.toElement();
- if (!elementFils.isNull())
- {
- if (elementFils.tagName().startsWith("dict_FOCUS" ))
- {
- QMap<QString, QString> album;
- parseAlbum(elementFils, album);
- if (album.size() > 0)
- {
- albums << album;
- }
- }
- else
- {
- parseAlbums(elementFils, albums);
- }
- }
- }
- }
|
l'appel et l'affichage se faisant ainsi :
Code :
- ...
- QDomElement docElem = doc.documentElement();
- QList<QMap<QString, QString> > albums;
- parseAlbums(docElem, albums);
- QMap<QString, QString> album;
- foreach (album, albums)
- {
- qDebug() << "Album :";
- foreach (QString cle, album.keys())
- {
- qDebug() << "\t" << cle << ":" << album[cle];
- }
- }
- ...
|
On obtient alors :
Code :
- Album :
- "Album" : "J Dilla - Legacy Vol.1"
- "Artist" : "1st Down"
- "Bit Rate" : "192"
- "Comments" : "FEFE2003"
- "Date Added" : "2010-11-03T21:01:56Z"
- "Date Modified" : "2010-06-25T16:49:08Z"
- "File Folder Count" : "5"
- "Genre" : "Hip-Hop"
- "Kind" : "Fichier audio MPEG"
- "Library Folder Count" : "1"
- "Location" : "file://localhost/Users/wizardman/Music/iTunes/iTunes%20Media/Music/1st%20Down/J%20Dilla%20-%20Legacy%20Vol.1/40%20No%20Place%20To%20Go.mp3"
- "Name" : "No Place To Go"
- "Persistent ID" : "BE4ED29CCB7ED086"
- "Sample Rate" : "44100"
- "Size" : "4409344"
- "Skip Count" : "1"
- "Skip Date" : "2012-12-14T14:31:18Z"
- "Total Time" : "183666"
- "Track ID" : "3456"
- "Track Number" : "40"
- "Track Type" : "File"
- "Year" : "2006"
- Album :
- "Album" : "J Dilla - Legacy Vol.2"
- "Artist" : "1st Down"
- "Bit Rate" : "192"
- "Comments" : "FEFE2003"
- "Date Added" : "2010-11-03T21:01:56Z"
- "Date Modified" : "2010-06-25T16:49:08Z"
- "File Folder Count" : "5"
- "Genre" : "Hip-Hop"
- "Kind" : "Fichier audio MPEG"
- "Library Folder Count" : "1"
- "Location" : "file://localhost/Users/wizardman/Music/iTunes/iTunes%20Media/Music/1st%20Down/J%20Dilla%20-%20Legacy%20Vol.1/40%20No%20Place%20To%20Go.mp3"
- "Name" : "No Place To Go"
- "Persistent ID" : "BE4ED29CCB7ED086"
- "Sample Rate" : "44100"
- "Size" : "4409344"
- "Skip Count" : "1"
- "Skip Date" : "2012-12-14T14:31:18Z"
- "Total Time" : "183666"
- "Track ID" : "3456"
- "Track Number" : "40"
- "Track Type" : "File"
- "Year" : "2006"
|
Et vous pouvez ensuite accéder directement aux champs qui vous intéressent, par exemple l'affichage de l'artiste du nom de tous les albums :
Code :
- ...
- QDomElement docElem = doc.documentElement();
- QList<QMap<QString, QString> > albums;
- parseAlbums(docElem, albums);
- QMap<QString, QString> album;
- foreach (album, albums)
- {
- qDebug() << "Album : " << album["Album"] << "par : " << album["Artist"];
- }
- ...
|
Bonne continuation ! |