ツリー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やバイナリファイルの書き込み、更新、解析を行います。
私のような何かをしたい:Qtのドムを使用してXMLファイルを解析し、作成するためのかなりまともですが、それは更新のためのツールを欠いているようです
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();
}
。どのような助けも非常に高く評価されます。私は、XMLファイルを更新してしまう例については、インターネット上で見てきた
ここで、この他のスレッドでは、便利になります。現在のノードを捕まえれば、子供を追加することができます。これまでのところ、私はそのようにする方法を理解していませんでした。
助けてくれてありがとうございました。私の無知を申し訳ありません。
それはあなたが言及答えよりも多くを望んでいることは何ですか? – Koying
こんにちは、ノードを更新したいと思います。たとえば、ユーザーはカテゴリ、コマンド、およびその他のデータを入力しますが、これはXMLで更新する必要があります。私はどのように新しいノードを挿入するかを知りませんでしたが、既存のものに基づいていました。 – zlogdan