将 XML 文件读入 C# DataSet 时出现问题

发布于 2024-07-04 13:48:38 字数 942 浏览 5 评论 0原文

我得到了一个 .xml 文件,我需要将其作为 DataSet 读入我的代码(作为背景,该文件是通过在 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,但我想了解为什么< code>ds.ReadXml(file) 以这种方式执行,因此我将来将能够避免这个问题。 谢谢。

I was given an .xml file that I needed to read into my code as a DataSet (as background, the file was created by creating a DataSet in C# and calling dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema), but this was done by someone else).

The .xml file was shaped like this:

 <?xml version="1.0" standalone="yes"?>
 <NewDataSet>
  <Foo>
    <Bar>abcd</Bar>
    <Foo>efg</Foo>
  </Foo>
  <Foo>
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>
  </Foo>
</NewDataSet>

Using C# and .NET 2.0, I read the file in using the code below:

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

Using a breakpoint, after this line ds.Tables[0] looked like this (using dashes in place of underscores that I couldn't get to format properly):

Bar     Foo-Id    Foo-Id-0
abcd     0         null
null     1         0
hijk     2         null
null     3         2

I have found a workaround (I know there are many) and have been able to successfully read in the .xml, but what I would like to understand why ds.ReadXml(file) performed in this manner, so I will be able to avoid the issue in the future. Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

怀中猫帐中妖 2024-07-11 13:48:38

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

This appears to be correct for your nested Foo tags:

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

So this correctly becomes 4 records in your result, with a parent-child key of "Foo-Id-0"

Try:

<NewDataSet>  
  <Rec>              <!-- Rec-Id: 0 -->
    <Bar>abcd</Bar>
    <Foo>efg</Foo>   
  </Rec>
  <Rec>              <!-- Rec-Id: 1 -->
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>   
  </Rec>
</NewDataSet>

Which should result in:

Bar     Foo        Rec-Id
abcd    efg        0
hijk    lmn        1
帝王念 2024-07-11 13:48:38

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

我的猜测(没有尝试自己重新生成它)是,当数据集尝试将层次结构“扁平化”为关系数据结构时,可能会发生一些事情。

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

2)实际上有两个名为“Foo”的元素,因此这可能解释了“Foo-Id-0”列的奇怪名称的生成(它为该列自动生成了一个唯一的名称 - 我猜你可能会想到这是数据集中的容错行为)。

These are my observations rather than a full answer:

My guess (without trying to re-produce it myself) is that a couple of things may be happening as the DataSet tries to 'flatten' a hierarchical structure to a relational data structure.

1) thinking about the data from a relational database perspective; there is no obvious primary key field for identifying each of the Foo elements in the collection so the DataSet has automatically used the ordinal position in the file as an auto-generated field called Foo-Id.

2) There are actually two elements called 'Foo' so that probably explains the generation of a strange name for the column 'Foo-Id-0' (it has auto-generated a unique name for the column - I guess you could think of this as a fault-tolerant behaviour in the DataSet).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文