【问题标题】:Issue reading XML file into C# DataSet将 XML 文件读入 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)会以这种方式执行,所以我将能够避免未来的问题。谢谢。

【问题讨论】:

    标签: c# .net xml .net-2.0


    【解决方案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 中的容错行为)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-02
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        相关资源
        最近更新 更多