将XML文件读取到C#DataSet中的问题

时间:2020-03-05 18:50:00  来源:igfitidea点击:

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

.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>

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

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

使用断点,在这行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)以这种方式执行,所以我将能够以避免将来出现此问题。谢谢。

解决方案

回答

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

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

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

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

回答

这对于嵌套的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