[XmlListModel] Récupérer tous les enfants
:salut:
Je souhaite récupérer toutes les valeurs d'un noeud XML. Le souci est que je ne connais pas d'avance le nombre d'enfants qu'il peut y avoir. Voici un exemple d'un XML tel qu'il pourrait exister :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<Test>
<model type="Type1">
<cpte>cpte1_1</cpte>
</model>
<model type="Type2">
<cpte>cpte2_1</cpte>
<cpte>cpte2_2</cpte>
</model>
<model type="Type3">
<cpte>cpte3_1</cpte>
<cpte>cpte3_2</cpte>
<cpte>cpte3_3</cpte>
</model>
</Test>
</rss> |
L'idée est de sélectionner le noeud via un combobox et ensuite récupérer dans une (ou plusieurs) variable(s) les enfants. Voici ce que je fais :
Code:
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
| import QtQuick 2.4
import QtQuick.XmlListModel 2.0
import QtQuick.Controls 1.3
Rectangle{
height : 150; width : 250
XmlListModel {
id: xmlModel
source: "feed.xml"
query: "/rss/Test/model"
XmlRole { name: "type"; query: "@type/string()" }
XmlRole { name: "cpte"; query: "string()" }
}
ComboBox {
x : 0 ; y : 10
model : xmlModel
textRole : "type"
onCurrentIndexChanged: {
var cpte = xmlModel.get(currentIndex).cpte.split('\n')
console.log(cpte)
}
}
} |
Cette méthode fonctionne à moitié. En effet le combobox est bien alimenté via le model, sur un changement d'index, je récupère "grossièrement" les valeurs des enfants, mais le souci est que c'est un peu le boxon (espace, saut de ligne, ...).
Cela nécessite plusieurs traitement afin d'obtenir des valeurs exploitables.
J'aimerai trouver un moyen de faire ça propre. J'ai regardé du coté des syntaxes XPath, mais déjà, tout ce qui commence par "/" est à bannir, le reste que j'ai essayé ne représente pas des query valident.
Si quelqu'un a une idée, qu'il n'hésite pas :mouarf:
En attendant je vais me coltiner quelques fonctions pour traiter le résultat que j'obtiens :aie:
@+ et merci par avance.
J
[EDIT]
Voila le code pour traitement :
Code:
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
| import QtQuick 2.4
import QtQuick.XmlListModel 2.0
import QtQuick.Controls 1.3
Rectangle{
height : 150; width : 250
function traitement(cpteGet){
var liste = []
for (var i=0 ; i<cpteGet.length ; i++){
if (cpteGet[i] !== ''){
var val = cpteGet[i]
var a = 0
while (true){
if (val[a] === ' '){
val = val.replace(' ','')
}
else {
liste.push(val)
break
};
}
}
}
return liste
}
XmlListModel {
id: xmlModel
source: "feed.xml"
query: "/rss/Test/model"
XmlRole { name: "type"; query: "@type/string()" }
XmlRole { name: "cpte"; query: "string()" }
}
ComboBox {
x : 0 ; y : 10
model : xmlModel
textRole : "type"
onCurrentIndexChanged: {
var cpte = xmlModel.get(currentIndex).cpte.split('\n')
var cpteModel = traitement(cpte)
console.log(cpteModel)
}
}
} |
Rien d'insurmontable, mais si quelque chose de tout fait existe, je suis preneur ;)