我得到了一个 .xml 文件,我需要将其作为数据集读入我的代码(作为背景,该文件是通过创建 DataSet 在 C# 中并调用 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) 以这种方式执行,这样我将来就可以避免这个问题。谢谢。

有帮助吗?

解决方案

这似乎适合您 嵌套的 福标签:

<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

其他提示

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top