0

DataSet にロードしたい XML ファイルがあります。

XML ファイルは、私が制御できないログ システムからのものです。これは、解析で助けが必要ないくつかの課題を生み出しています...

XML ファイルは次のようになります。

<LogEntry>
<DateTime></DateTime>
<AppId></AppId>
<Description>
   <EncryptedData>
      <CipherValue></CipherValue>
   </EncryptedData>
</Description>
<Module></Module>
</LogEntry>

注: XML DocType はありません。これが DataSet に必要かどうかわかりませんか?

通常、ルート ノードはありません。プログラムが停止/再起動されない限り、ドキュメントの「」と「」の開始タグと終了タグなど。起動時にルートノードを作成するようですが、実行時にサイズが原因でファイルが削除された場合、ルートノードを再作成しません。

問題 1 - ルート ノードが見つからない問題を処理する最善の方法は何ですか? DataSet の ReadXML() 関数を介してロードし、必要に応じて先頭に追加して追加する前に、ファイルを開いて検索する必要がありますか?

問題 2 - サブノードを含むエントリが DataSet にロードされていないようです。ReadXML() はこの要素をスキップしているようです。その特定の列にアクセスしようとするとエラーが発生し、存在しないことが通知されるためです。IE、上記の「説明」。

問題 #3 - 「説明」列をロードするときに、BASE64 でエンコードされているため、「CipherValue」データにアクセスする必要があります。この情報を解読する必要があります。私はこれに関する情報を持っています。

この演習を行う主な理由は、データを解読できるように「説明」列にアクセスすることです。実際にはさらに多くの列といくつかのサブノードがあることに注意してください...しかし、基本的な考え方は同じです。

かなり大きな XML ファイルの操作が簡単になるので、DataSet を使用しようとしていますか? 多分もっと良い方法がありますか?

例として、以下のコードは機能しますが、サブノードが表示されません (列が存在しないことを返す行をコメントアウトしました)。

Console.WriteLine("Rows found = {0}", dt.Rows.Count);
foreach (DataRow row in dt.Rows)
{
    Console.WriteLine("{0} {1} {2}", 
    row["DateTime"], 
    row["AppId"],
    //row["Description"],
    row["Module"]
    );

XML スキーマが必要だと思いますが、データを思いどおりに読み取れるように (上記の例でさえ) これをどのように記述すればよいかわかりません。

これに関するヘルプや指示は大歓迎です。

4

1 に答える 1

1

DataSet クラスは、汎用の XML 入出力用ではありません。これは、リレーショナル データベース モデルのインメモリ表現です。リレーショナル データベースとして表現できなかったものは表現できません。

データは、、および列を含むLogEntryテーブルとしてモデル化できます。しかし、何ですか?これはテーブルの外部キーではありません -どちらの側にもIDはありません!DateTimeAppIdModuleDescriptionEncryptedData

于 2013-02-05T02:58:14.820 に答える