我有一個應用程序構建一個基於樹Qt組件的左側菜單。爲了加載它,我需要解析一個XML文件。 XML文件如下所示:使用Qt DOM更新XML文件
<comandos>
<categoria>
<nome>Cupom fiscal</nome>
<comando>
<nome>01 - Abrir Cupom Fiscal</nome>
<env>3</env>
<rec>4</rec>
<desc>CNPJ/CPF : </desc>
<desc>Nome : </desc>
<desc>Endereco: </desc>
</comando>
</categoria>
</comandos>
我實際上可以使用QtDOM讀取此XML。
QDomDocument doc("ComandosML");
QFile file("comandos.xml");
int r = 0;
datafields.clear();
receFields.clear();
categories.clear();
if(!file.open(QIODevice::ReadOnly))
return -1;
if(!doc.setContent(&file))
{
file.close();
return -2;
}
// Ok we are ready to parse DOM
QDomElement root = doc.documentElement();
if(root.tagName() != "comandos")
return -3;
QDomNode n = root.firstChild();
while(!n.isNull())
{
QDomElement e = n.toElement();
if(!e.isNull())
{
if(e.tagName() == "categoria")
{
QDomNode cat = n.firstChild();
while(!cat.isNull())
{
QDomElement CatName = cat.toElement();
if (CatName.tagName() == "nome")
{
QString s = CatName.text();
if (s != "")
{
categories.push_back(s);
item = new QStandardItem((s));
item->setEditable(false);
}
}
if (CatName.tagName() == "comando")
{
QDomNode params = cat.firstChild();
QString qdCmd;
int env = 0;
int rec = 0;
Categories Desc;
while (!params.isNull())
{
QDomElement ParamName = params.toElement();
if (ParamName.tagName() == "nome")
{
qdCmd = ParamName.text();
child = new QStandardItem((qdCmd));
child->setEditable(false);
child->setDragEnabled(false);
item->appendRow(child);
}
else
if (ParamName.tagName() == "env")
{
env = ParamName.text().toInt();
}
else
if (ParamName.tagName() == "rec")
{
rec = ParamName.text().toInt();
}
else
if (ParamName.tagName() == "desc")
{
Desc.push_back(ParamName.text());
}
params = params.nextSibling();
}
datafields.insert(pair<QString,int>( qdCmd, env ));
receFields.insert(pair<QString,int>( qdCmd, rec ));
descriptions.insert(pair<QString, Categories>(qdCmd, Desc));
}
cat= cat.nextSibling();
}
model->setItem(r++,item);
}
}
n = n.nextSibling();
}
file.close();
return 0;
在解析我已經裝配的菜單之間。畢竟,當用戶編輯XML文件並重新加載應用程序時,我已經設置了更新XML,我只需擦除樹並重新創建。你可以看到我也將一些數據傳遞給了一些結構,它們基本上是std :: vector和std :: map。上面的代碼是用Qt文檔中的例子編寫的,順便說一下,這些代碼非常體面。
碰巧寫了一個簡單的對話框讓用戶避免編輯XML。好的,對我來說,即使從用戶的角度來看,編輯XML也可能更容易也更簡單,但是可能的用戶更喜歡在對話框上編輯東西。這一切都OK。我可以將數據傳遞給應用程序。一點都不麻煩。
但我需要更新XML。基本上編輯將包括通過添加新節點或將子節點插入到下來更新節點。我如何更新節點?有什麼具體的方法來完成這一點?我的XML經驗很短,我通常編寫,更新,解析txt和二進制文件。
我想要做的事,如:
if(root.tagName() != "comandos")
return -3;
QDomNode n = root.firstChild();
while(!n.isNull())
{
QDomElement e = n.toElement();
if(!e.isNull())
{
if(e.tagName() == "categoria")
{
QDomNode cat = n.firstChild();
while(!cat.isNull())
{
QDomElement CatName = cat.toElement();
if (CatName.tagName() == "nome")
{
QString s = CatName.text();
if (s != qsCategory)
{
// we have not found the category
// add it here
}
else
{
// the category exists simply update
}
}
cat= cat.nextSibling();
}
}
}
n = n.nextSibling();
}
看來,使用Qt DOM是解析和創建XML文件相當不錯,但缺少的工具更新。任何幫助將非常感激,即使是一個例子。
這裏這個其他線程,
我已經看過在互聯網上的例子都將更新一個XML文件看起來非常有用。看來,如果我抓住當前節點,我可以添加一個孩子,到目前爲止,我沒有弄清楚如何做到這一點。
感謝您的幫助,顯然對我的無知感到抱歉。
它是什麼,你想比你提到的答案嗎? – Koying 2012-03-21 15:17:20
嗨,我想更新節點。例如,用戶將鍵入類別,命令和其他數據,這需要在XML中進行更新。我沒有找到如何插入新的節點,但基於以前存在的。 – zlogdan 2012-03-21 15:47:53