将 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的形式返回出来,求代码

C# XML 反序列化为一张表中的 DataSet

将 XML 文件读入 XmlDocument

使用存储过程 For XML Path 直接读入绑定到 DataGridView 的 DataSet?

C# DataSet转为word 急用! 我把xml文件转为DataSet了,现在需要把DataSet转为Word导出。

将 XML 文件读入 XmlDocument 时如何忽略注释? [复制]