6

我得到了一个 .xml 文件,我需要将其作为 DataSet 读入我的代码(作为背景,该文件是通过在 C# 中创建一个DataSet并调用创建的dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema),但这是由其他人完成的)。

.xml 文件的形状如下:

 <?xml version="1.0" standalone="yes"?>
 <NewDataSet>
  <Foo>
    <Bar>abcd</Bar>
    <Foo>efg</Foo>
  </Foo>
  <Foo>
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>
  </Foo>
</NewDataSet>

使用 C# 和 .NET 2.0,我使用以下代码读取文件:

        DataSet ds = new DataSet();
        ds.ReadXml(file);

使用断点,之后line ds.Tables[0]看起来像这样(使用破折号代替我无法正确格式化的下划线):

Bar     Foo-Id    Foo-Id-0
abcd     0         null
null     1         0
hijk     2         null
null     3         2

我找到了一种解决方法(我知道有很多)并且能够成功读取.xml,但是我想了解为什么ds.ReadXml(file)以这种方式执行,所以我将来可以避免这个问题。谢谢。

4

2 回答 2

4

这对于您的嵌套Foo 标签似乎是正确的:

<NewDataSet>  
  <Foo>              <!-- Foo-Id: 0 -->
    <Bar>abcd</Bar>
    <Foo>efg</Foo>   <!-- Foo-Id: 1, Parent-Id: 0 -->
  </Foo>
  <Foo>              <!-- Foo-Id: 2 -->
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>   <!-- Foo-Id: 3, Parent-Id: 2 -->
  </Foo>
</NewDataSet>

因此,这正确地成为您的结果中的 4 条记录,父子键为“Foo-Id-0”

尝试:

<NewDataSet>  
  <Rec>              <!-- Rec-Id: 0 -->
    <Bar>abcd</Bar>
    <Foo>efg</Foo>   
  </Rec>
  <Rec>              <!-- Rec-Id: 1 -->
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>   
  </Rec>
</NewDataSet>

这应该导致:

Bar     Foo        Rec-Id
abcd    efg        0
hijk    lmn        1
于 2008-09-09T13:24:06.793 回答
0

这些是我的观察,而不是完整的答案:

我的猜测(没有尝试自己重新生成它)是,当 DataSet 试图将层次结构“扁平化”为关系数据结构时,可能会发生一些事情。

1)从关系数据库的角度思考数据;没有明显的主键字段来标识集合中的每个 Foo 元素,因此 DataSet 自动使用文件中的序号位置作为自动生成的字段,称为 Foo-Id。

2)实际上有两个元素称为“Foo”,因此这可能解释了为“Foo-Id-0”列生成了一个奇怪的名称(它为该列自动生成了一个唯一名称 - 我想你可以想到这作为 DataSet 中的容错行为)。

于 2008-09-09T12:48:44.180 回答