XML反序列化DataTable或DataSet

3

I have the following 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

InnerException:

"http://www.w3.org/2001/XMLSchema'> 未被预期。"

我该如何反序列化这个东西?


2
我认为问题是因为你已经调用了reader.ReadStartElement,尝试初始化reader并将其直接传递给XmlSerializer。 - undefined
你能否写一个示例代码来演示如何做到这一点? - undefined
2个回答

10

问题已解决。似乎直接使用现有的DataSetReadXml()方法进行读取就可以了。

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

现在我可以通过 dataSet.Tables[0] 访问表格。

我将一个 DataTable 序列化为一个 xml 字符串,并且之后想要创建一个单元测试。通过您提供的 DataSet 代码,我可以通过 Tables 属性中的 TableCollection 访问到 DataTable。太棒了!给您点赞,先生。 - undefined

0
我无法为你提供示例代码,因为我没有上下文与你的其他代码。请参阅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节点... - undefined
没有上下文的情况下,很难告诉你发生了什么,请更新你的问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接