2

我有以下 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);.

架构和实际数据在它们中可能不同。

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

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)。源=System.Xml

内部异常:

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

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

4

2 回答 2

9

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

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

现在我可以到达桌子了dataSet.Tables[0]

于 2013-06-28T11:32:58.470 回答
0

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

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

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

reader.ReadStartElement("NewDataSet");

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

于 2013-06-28T09:05:30.387 回答