0

我有一个想要加载到数据集中的 XML 文件。

XML 文件来自我无法控制的日志记录系统;这带来了一些挑战,我在解析时需要帮助......

XML 文件如下所示:

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

注意:没有 XML DocType。不确定这对 DataSet 是否必要?

通常,没有根节点。除非程序停止/重新启动,否则文档的“和”开始和结束标记。它似乎在启动时创建根节点,但如果文件在运行时因大小而被删除,它不会重新创建根节点。

问题 #1 - 处理丢失根节点问题的最佳方法是什么?我是否应该在尝试通过 DataSet 的 ReadXML() 函数加载之前打开文件并查找它,并在必要时预先添加 - 并附加?

问题 #2 - 带有子节点的条目似乎没有加载到数据集中。ReadXML() 似乎跳过了这个元素;因为我在尝试访问该特定列时遇到错误,它告诉我它不存在。IE,上面的“描述”。

问题 #3 - 当我加载“描述”列时,我需要访问“CipherValue”数据,因为它是 BASE64 编码的。我将不得不解密这些信息。我有这方面的信息。

访问“描述”列以便我可以解密数据是我进行此练习的主要原因。请注意,确实有更多的列和更多的子节点……但基本思想相同。

我正在尝试使用 DataSet,因为我认为它会使处理相当大的 XML 文件变得更容易?也许有更好的方法?

例如,下面的代码可以工作,但我再次没有看到子节点(我注释掉了返回列不存在的行):

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具有DateTime和列AppId的表。Module但什么是Description?它不是表的外键-两边都EncryptedData没有id !

于 2013-02-05T02:58:14.820 回答