1

XMLファイルからGUIにデータの一部をロードする必要があるプロジェクトに取り組んでいます。GUIを使用すると、ユーザーはデータにいくつかの変更を加えることができます。私ができるようにしたいのは、これらの変更をXMLファイルに保存して戻すことです。

ファイル全体を書き換えることは可能ですが、ファイルはかなり巨大であり、ファイル内のすべてのデータが変更されているわけではなく、プログラムで使用されているわけでもありません。

これは、TinyXMLとC++Builderを使用した最初のプロジェクトです。私はこれにどのように取り組むべきかについていくつかの提案を探しています。

4

3 に答える 3

4

新しいテキストが古いテキストとまったく同じサイズになることが確実でない限り、テキストファイルの一部だけを書き直すことは一般的には良い考えではありません。断片的な置換が可能なファイル形式があります。XMLはそれらの1つではありません。少なくとも、一般的なケースではありません。

ファイルの途中にデータを挿入して残りを下に移動することは、基本的に、ファイルの残りをロードし、ファイルを大きくして、書き戻すことと同じです。したがって、ファイル全体をロードし、変更を加えて、再度保存することもできます。コードは単純になり、それほど遅くなることはないでしょう。

いいえ、SAXパーサーはここでは役に立ちません。読み取りをストリーミングすることはできますが(プッシュパーサーではなくプルパーサーをお勧めします)、ファイルにデータを挿入することはできません。これは、私が知っているほとんどのXMLパーサーでは一般的にサポートされていません。データを書き込むことはできますが、書き込むことと非破壊的に挿入することは2つの異なることです。

于 2012-02-28T15:42:27.070 に答える
2

TinyXmlを使用すると、ファイルの内容を損傷することなく(有効なxmlである限り)、必要な処理を実行できます。私はこれをチェックしたばかりなので、かなり確信しています。もちろん、編集する属性とタグを正確に知る必要がありますが、編集するタグ内であっても、既存の属性/タグ/コメントに影響を与えることなく、タグを追加/編集できます。構造に慣れるまで少し時間がかかりますが、それは間違いなく可能です。

xmlの構造を知っている必要があります!

TiXmlDocument doc("filepath"); //will open your document

if (!doc.LoadFile()) //you do have to open the whole file
{
    cout<<"No XML structure found"<<endl;
    return; // exit function don't load anything
}
TiXmlElement *root = doc.RootElement(); //pointer to root element

これで、このポインタと次のようなコマンドを使用できます。

root->FirstChild("tageone")->ToElement();
tageone->SetDoubleAttribute("attribute", value);

ものを変更します。

急いで説明して申し訳ありませんが、コツをつかむにはドキュメントを少し読む必要があります。

乾杯

于 2012-03-07T08:47:32.533 に答える
0

アップデート

コメントで言ったように、ファイルの途中に挿入した方がいいとは思いません。ただし、追加のセキュリティが必要/必要な場合は、次の2つの追加手順をお勧めします。

  • すべての重要なステップでxmlファイルの健全性チェックを実行します。これは、読んでいるファイルが本当に必要なものであることを確認する場所であれば何でもかまいません。
  • 保存する前にファイル全体の内容のチェックサムを計算し、後でチェックします。これは必ずしもCRCである必要はありません。関数に名前を付けただけcalculate_crc()です。データの整合性を検証できるものはすべて良好です。

私はこれをおおよそ次のように行います(擬似コード):

TiXmlDocument doc( "demo.xml" );
doc.LoadFile();

perform_sanitycheck(doc);

//  do whatever you need to change

perform_sanitycheck(doc);
unsigned int crc = calculate_crc(doc);

doc.SaveFile("temp_name.xml");  // save the file under another name

TiXmlDocument doc2( "temp_name.xml" );
perform_sanitycheck(doc2);
if(verify_crc(doc, crc))
{
    delete_file("demo.xml");
    rename_file("temp_name.xml", "demo.xml");
}

健全性チェックは、必要に応じて適切なアクションを実行します。delete_file()環境に合わせて、2つの関数とAPIまたはライブラリ関数を置き換える必要がありrename_file()ます。

機能calculate_crc()verify_crc()は、変更が必要な部分のみをチェックするように特別に作成することができます。

于 2012-02-28T16:35:33.897 に答える