【问题标题】:XML Deserialization of DataTable or DataSetDataTable 或 DataSet 的 XML 反序列化
【发布时间】:2013-06-25 23:15:52
【问题描述】:

我有以下 XML:

     <NewDataSet>
        <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
          <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Data" msdata:UseCurrentLocale="true">
            <xs:complexType>
              <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="Data">
                  <xs:complexType>
                    <xs:sequence>
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
              </xs:choice>
            </xs:complexType>
          </xs:element>
        </xs:schema>
     </NewDataSet>

我知道这是通过使用 new XmlSerializer(typeof(DataTable)).Serialize(writer, (DataTable)myDataTable); 序列化 DataTable 创建的。

架构和实际数据可能不同。

我需要反序列化它,并尝试了以下方法:

reader.ReadStartElement("NewDataSet");
var dataSet = (DataTable)new XmlSerializer(typeof(DataTable)).Deserialize(reader);
reader.ReadEndElement();

还有:

reader.ReadStartElement("NewDataSet");
var dataSet = (DataSet)new XmlSerializer(typeof(DataSet)).Deserialize(reader);
reader.ReadEndElement();

我得到的只是

System.InvalidOperationException 未处理 Message=XML 文档中存在错误 (26, 14)。 Source=System.Xml

内部异常:

“http://www.w3.org/2001/XMLSchema'> 不是预期的。”

我怎样才能反序列化那个东西?

【问题讨论】:

  • 我认为问题是因为你已经调用了 reader.ReadStartElement,尝试初始化 reader 并将其直接传递给 XmlSerializer
  • 你能写一个示例代码吗?

标签: c# wpf xml serialization datatable


【解决方案1】:

设法解决它。似乎当我们使用其ReadXml() 方法直接读取现有的DataSet 时,它就可以工作了。

var dataSet = new DataSet();
dataSet.ReadXml(reader);

现在我可以以dataSet.Tables[0] 的身份到达餐桌

【讨论】:

  • 我将一个 DataTable 序列化为一个 xml 字符串,然后想创建一个单元测试。使用您提供的 DataSet 代码,我可以通过 Tables 属性中的 TableCollection 访问 DataTable。伟大的!有一个 +1 先生。
【解决方案2】:

我无法真正为您提供示例代码,因为我没有您其他代码的上下文。

查看 XmlSerializer.Deserialize 的文档:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx 并注意初始化它的不同方法。

您的阅读器应该在流的开头,而不是在您调用之后

reader.ReadStartElement("NewDataSet");

不要开始阅读 XML,只需通过反序列化您的阅读器。更简单的是,您可以直接将文件/内存流传递给它。

【讨论】:

  • 当我跳过reader.ReadStartElement("NewDataSet");时它也不起作用当reader.LocalName是NewDataSet时,它说“NewDataSet”是意外的XML节点......
  • 如果没有上下文,真的不可能告诉你发生了什么,请更新你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多