将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