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 スキーマが必要だと思いますが、データを思いどおりに読み取れるように (上記の例でさえ) これをどのように記述すればよいかわかりません。
これに関するヘルプや指示は大歓迎です。