将具有混合复杂类型元素的 XML 转换为 DataSet,以及其他 DataSet 限制

Posted

技术标签:

【中文标题】将具有混合复杂类型元素的 XML 转换为 DataSet,以及其他 DataSet 限制【英文标题】:Converting XML with mixed complex type elements into DataSets, and other DataSet limitations 【发布时间】:2009-11-11 05:29:30 【问题描述】:

这是一个两部分的问题。第一个是关于 DataSet 和 XML 的具体问题。第二个是更一般的“我是否采取了正确的方法”类型的问题。虽然我当然希望能回答这两个问题,但我也欢迎只解决其中一个问题的答案!

问题 1

DataSet 类是否支持mixed complex type elements?例如,假设我有以下 XML:

<cars>
   <car id="1">10000
     <colour>blue</colour>
     <doors>4</doors>
   </car>
</cars>

描述此 XML 的 XSD 将具有复杂类型,其中“混合”属性设置为 true。这使我能够以纯文本形式获得汽车的价值(10,000 美元),然后是我需要的任何其他元素。

但是,当我将此 XML 转换为 DataSet 并使用以下代码再次返回时:

StringReader sr = new StringReader(xml);
DataSet dataset = new DataSet();
dataset.ReadXml(sr);
sr.Close();

StringWriter sw = new StringWriter();
dataset.WriteXml(sw);
xml = sw.ToString();
sw.Close();

那么生成的XML如下:

<cars>
   <car id="1">
     <colour>blue</colour>
    <doors>4</doors>
  </car>
</cars>

即值“10000”丢失。

这不仅发生在我通过 ReadXml() 调用推断 XML 架构(如上),而且如果我提供 XSD(例如通过调用 ReadXmlSchema())。

有什么办法可以避免这种情况吗?还是我应该确保避免混合类型?

问题 2

在将 XML 转换为 DataSet 或反之亦然时,是否还有其他限制(例如上述限制)?

或者也许问题 1 表明我正在以相反的顺序处理事情。目前,我从所需的 XML(例如上面的汽车示例)开始,并将其转换为 DataSet。目的是将数据作为 XML 保存到数据库中,当我希望在 WinForm 上显示这些数据时,我会将 XML 转换为 DataSet 并在 DataSet 中的各个表上使用数据绑定。但与其从 XSD 开始,也许我应该先将我的数据定义为(类型化的)DataSet,然后让 ReadXml/WriteXml 方法处理 XML 的样子?

【问题讨论】:

【参考方案1】:

感谢您的所有回复。 ;)

看到没有人能够提供帮助,我想我会尝试回答我自己的问题:

问题 1 - DataSet 类根本不允许混合类型的元素。除了我自己的测试之外,我能找到的唯一确认是 this MSDN forum post,ADO.NET 程序管理器在其中写道:“这种行为是设计使然 - DataSet 不支持混合内容 XML/XSD。”

问题 2 - 这说明了从 XML/XSD 开始并尝试将其转换为 DataSet 的危险。这导致我们重新思考我们的方法,目的是首先从 DataSet 开始,并让 XML 格式从中派生出来,而不是反过来。

(仍然欢迎其他人的想法!)

【讨论】:

以上是关于将具有混合复杂类型元素的 XML 转换为 DataSet,以及其他 DataSet 限制的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据框转换为具有混合列类型的稀疏矩阵?

xsd 具有混合内容的复杂类型

在 R 中使用混合类型将嵌套列表中的字符数字转换为数字

XSLT 转换从混合内容中删除 HTML 元素

使用杰克逊将具有重复元素的 XML 转换为 JSON

使用 Python 或 XSLT 将复杂的 XML 转换为 CSV