将具有混合复杂类型元素的 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 限制的主要内容,如果未能解决你的问题,请参考以下文章