Hi all,
I read a very simple XML created by me. I parse it on a QDomDocument.
My XML is:
<?xml version='1.0' encoding='utf-8'?>
<data>
<feature>
<name>Sex</name>
<value>Male</value>
<value>Female</value>
<value>Unknown</value>
</feature>
<feature>
<name>Color</name>
<value>Red</value>
<value>Green</value>
<value>Blue</value>
<value>White</value>
<value>Black</value>
<value>Unknown</value>
</feature>
<feature>
<name>Size</name>
<value>Small</value>
<value>Medium</value>
<value>Large</value>
<value>Unknown</value>
</feature>
</data>
<?xml version='1.0' encoding='utf-8'?>
<data>
<feature>
<name>Sex</name>
<value>Male</value>
<value>Female</value>
<value>Unknown</value>
</feature>
<feature>
<name>Color</name>
<value>Red</value>
<value>Green</value>
<value>Blue</value>
<value>White</value>
<value>Black</value>
<value>Unknown</value>
</feature>
<feature>
<name>Size</name>
<value>Small</value>
<value>Medium</value>
<value>Large</value>
<value>Unknown</value>
</feature>
</data>
To copy to clipboard, switch view to plain text mode
I parse the XML:
QFile file("metadata.xml");
cout<< "ERROR"<< endl;
return;
}
if (!doc.setContent(&file)) {
cout << "ERROR" << endl;
file.close();
return;
}
file.close();
QDomDocument doc("mydocument");
QFile file("metadata.xml");
if (!file.open(QIODevice::ReadOnly)){
cout<< "ERROR"<< endl;
return;
}
if (!doc.setContent(&file)) {
cout << "ERROR" << endl;
file.close();
return;
}
file.close();
To copy to clipboard, switch view to plain text mode
So, I want to show the XML in a QTreeView.To do that, I have to create a QStandardItemModel. ¿Any ideas?
My idea is something like this:
if(!dom.isNull()){
int nRow = row+1;
string aux = dom.nodeName().toStdString();
string name = "name";
string value = "value";
if(dom.isText()){
aux = dom.parentNode().nodeName().toStdString();
if(strcmp(aux.c_str(),name.c_str())==0){
cout << dom.nodeValue().toStdString() << endl;
//New ROW
SubQStandardItem *item = new SubQStandardItem(dom.nodeValue());
item->setEditable(false);
model->setItem(nRow, item);
}
if(strcmp(aux.c_str(),value.c_str())==0){
//New SubItems
cout << "\t" << dom.nodeValue().toStdString() << endl;
SubQStandardItem *subItem = new SubQStandardItem( dom.nodeValue() );
subItem->setCheckable(true);
subItem->setEditable(false);
}
}else{
preOrder(dom.firstChild(), model, nRow);
preOrder(dom.nextSibling(), model, nRow);
}
}
}
void MainWindow::preOrder(QDomNode dom, QStandardItemModel *model, int row){
if(!dom.isNull()){
int nRow = row+1;
string aux = dom.nodeName().toStdString();
string name = "name";
string value = "value";
if(dom.isText()){
aux = dom.parentNode().nodeName().toStdString();
if(strcmp(aux.c_str(),name.c_str())==0){
cout << dom.nodeValue().toStdString() << endl;
//New ROW
SubQStandardItem *item = new SubQStandardItem(dom.nodeValue());
item->setEditable(false);
model->setItem(nRow, item);
}
if(strcmp(aux.c_str(),value.c_str())==0){
//New SubItems
cout << "\t" << dom.nodeValue().toStdString() << endl;
SubQStandardItem *subItem = new SubQStandardItem( dom.nodeValue() );
subItem->setCheckable(true);
subItem->setEditable(false);
}
}else{
preOrder(dom.firstChild(), model, nRow);
preOrder(dom.nextSibling(), model, nRow);
}
}
}
To copy to clipboard, switch view to plain text mode
This code (not work...) is based on the pre-order algorithm.
Please help!!! 
Thanks in advance!!!!
Bookmarks