将 XML 文件读入 C# DataSet 的问题
Posted
技术标签:
【中文标题】将 XML 文件读入 C# DataSet 的问题【英文标题】:Issue reading XML file into C# DataSet 【发布时间】:2010-09-08 06:44:47 【问题描述】:我得到了一个 .xml 文件,我需要将该文件作为数据集读入我的代码(作为背景,该文件是通过在 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)
会以这种方式执行,所以我将能够避免未来的问题。谢谢。
【问题讨论】:
【参考方案1】:这对于您的 嵌套 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
【讨论】:
【参考方案2】:这些是我的观察,而不是完整的答案:
我的猜测(没有尝试自己重新生成)是,当 DataSet 试图将层次结构“扁平化”为关系数据结构时,可能会发生一些事情。
1) 从关系数据库的角度思考数据;没有明显的主键字段来标识集合中的每个 Foo 元素,因此 DataSet 自动使用文件中的序号位置作为自动生成的字段,称为 Foo-Id。
2) 实际上有两个元素称为“Foo”,因此这可能解释了为“Foo-Id-0”列生成了一个奇怪的名称(它已经为该列自动生成了一个唯一名称 - 我猜你可以认为这是 DataSet 中的容错行为)。
【讨论】:
以上是关于将 XML 文件读入 C# DataSet 的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何把XML里面的节点内容以DataSet的形式返回出来,求代码
使用存储过程 For XML Path 直接读入绑定到 DataGridView 的 DataSet?
C# DataSet转为word 急用! 我把xml文件转为DataSet了,现在需要把DataSet转为Word导出。