【问题标题】:Xml loaded dataset is missing a tableXml 加载的数据集缺少表
【发布时间】:2011-09-29 13:23:08
【问题描述】:

当我将 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;
}

编辑:

为了清楚,我想知道为什么 DataSet ds 没有 root 表而 ds2 有。

有人做出了决定:

  1. 如果在给定的父标签下仅存在一个具有给定标签名称的节点,则它成为表中由父标签命名的列。
  2. 如果存在多个这样的节点,它就会自己变成一张表
  3. 如果所有子节点出现多次且父节点是文档根,则不会创建父表

#3 的原因是什么?

【问题讨论】:

    标签: c# system.data system.xml


    【解决方案1】:

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

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

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

    【讨论】:

    • 将创建一个 Id 列。根节点确实包含信息:商店在同一级别上相互关联。我知道这就是它的工作方式,我想了解为什么它是这样工作的。
    • 之所以如此工作,是因为该设计满足了将 XML 序列化为数据集的大多数用例。这并不是说你希望它的工作方式是无效的——这不是常态。如果您确实需要它以特定方式工作 - 您始终可以“推出自己的”序列化方法。
    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2015-03-29
    相关资源
    最近更新 更多