使用数据集读取具有子节点的XML文件

本文关键字:子节点 XML 文件 数据集 读取 | 更新日期: 2023-09-27 17:57:43

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

XML文件来自一个我无法控制的日志系统;这带来了一些挑战,我需要帮助进行解析。。。

XML文件如下所示:

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

注:没有XML DocType。不确定这对于数据集是否必要?

通常,没有根节点。例如文档的"answers"打开和关闭标记,除非程序停止/重新启动。它似乎在启动时创建根节点,但如果在运行时由于文件大小而删除文件,它将不会重新创建根节点。

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

问题#2-数据集中似乎未加载具有子节点的条目。ReadXML()似乎正在跳过此元素;因为我在尝试访问那个特定的列时遇到了一个错误,它告诉我它不存在。即,上文"说明"。

问题#3-当我加载"Description"列时,我需要accdess"CipherValue"数据,因为它是BASE64编码的。我必须解密这些信息。我有这方面的信息。

访问"描述"列以便解密数据是我进行此练习的主要原因。请注意,实际上有更多的列和更多的子节点。。。但基本思想是一样的。

我尝试使用数据集是因为我认为它会使处理相当大的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模式,但我不知道如何编写它(即使是上面的例子),这样我就可以按照我想要的方式读取数据。

如有任何帮助或指导,我们将不胜感激。

使用数据集读取具有子节点的XML文件

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

您的数据可以建模为具有DateTimeAppIdModule列的LogEntry表。但什么是Description?它不是EncryptedData表的外键-两边都没有id