将DataSet用于带子节点的ReadXML文件

时间:2013-02-04 23:47:50

标签: c# xml

我有一个XML文件,我想加载到DataSet中。

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()似乎正在跳过这个元素;因为我在尝试访问该特定列时遇到错误,它告诉我它不存在。 I.E.,上面的“描述”。

问题#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模式 - 但我不知道如何写这个(即使是上面的例子),这样我就可以按照我想要的方式读取数据。

非常感谢任何帮助或方向。

1 个答案:

答案 0 :(得分:1)

DataSet类不适用于通用XML输入和输出。它是关系数据库模型的内存表示。它不能代表任何无法表示为关系数据库的内容。

您的数据可以建模为包含LogEntryDateTimeAppId列的Module表格。但是什么是Description?它不是EncryptedData表的外键 - 两边都没有 id