Xml加载的数据集缺少一个表

本文关键字:一个 加载 数据集 Xml | 更新日期: 2023-09-27 18:09:58

当我将xml文件读入数据集时,如果根节点每个子标记有一个以上,它就不会为根节点创建表。为什么会这样?有没有办法让它在不修改xml的情况下生成根表?

static void Main(string[] args) {
    var ds =Load(@"<root>
      <Stores>Lambton Quay</Stores>
      <Stores>Willis Street</Stores>
    </root>");
    var ds2 = Load(@"<root>
      <t>1</t>
      <Stores>Lambton Quay</Stores>
      <Stores>Willis Street</Stores>
    </root>");
    Console.WriteLine("ds table count: {0}", ds.Tables.Count); //1 <- expecting 2
    Console.WriteLine("ds2 table count: {0}", ds2.Tables.Count); //2
    Console.ReadKey();
}
static DataSet Load(string xml) {
    var xd = new XmlDocument();
    xd.LoadXml(xml);
    var ds = new DataSet();
    ds.ReadXml(new XmlNodeReader(xd));
    return ds;
}

编辑:

要清楚,我想知道为什么数据集ds没有root表,而ds2有。

某人做了决定:

  1. 如果在给定父标记下只有一个具有给定标记名的节点,则它将成为由父标记命名的表中的列。
  2. 如果存在多个这样的节点,它将成为一个独立的表
  3. 如果所有子节点出现不止一次,并且父节点是文档根节点,则不会创建父表

#3的原因是什么?

Xml加载的数据集缺少一个表

第一个XML示例没有在数据集中创建"根"表,因为在具有该名称的表中没有创建行或列。

在第二个示例中,尝试添加第二个<t>元素。您仍然会得到两个表,但它们将被命名为"t"answers"Stores"(而不是"root"answers"Stores")。另一个测试是在第二个例子中添加另一个不同的元素(比如<r>1</r>)。在这种情况下,你仍然有两个表"根"answers"商店",但现在"根"表将有1行2列(列"r"和列"t")。

当解析器看到两个具有相同名称的元素时,它将为该元素创建一个表,并且该元素的每个实例将成为表中的新行。当解析器在一个节点下看到多个单个元素时,它将使用父节点的名称作为表名创建一个表,并且父节点下的每个单个元素将是表中的一列。