如何将 XML 反序列化为列表<class>



给定以下HTTP POST响应(请求有效):

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
<schema xmlns="http://www.w3.org/2001/XMLSchema">schema</schema>xml</DataSet>

这个XSD(XML模式定义,部分):

<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="MTM">
<xs:complexType>
<xs:sequence>
<xs:element name="MTMDate" type="xs:dateTime" minOccurs="0" />
<xs:element name=......

更多";列";元素跟随在CCD_ 1元素之后。

我尝试反序列化XML中返回的数据的代码:

[XmlRoot("MTM")]
public class MTM
{
[XmlElement("MTM")]
public List<MTMItem> MTMData { get; set; }
}
public class MTMItem
{
[XmlElement("MTMDate")]
public DateTime MTMDate { get; set; }
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MTM));
MTM mtmData = (MTM)xmlSerializer.Deserialize(response.GetResponseStream());

运行时,在线路MTM mtmData = ..上,我得到以下错误:

There is an error in XML document (2,2)IvalidOperationException: <DataSet xmlns='http://tempuri.org/'> was not expected

我想我把[XmlRoot("MTM")]部分弄错了,没有正确地遵循XSD Schema,以便将其分解为List<MTM>

编辑:

data填充了byte[]数据,这是我的xml数据吗?然后我需要将其反序列化为数据集?

using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}

您提供的XML内容表示一个.net对象,该对象是为表示称为DataSet的数据库响应而设计的。您可以编写自己的反序列化类来获取所需的数据,但根据文档,您可能会更好地使用.net框架中的内置行为

相关的部分是标题为创建XMLWeb服务客户端的部分因为服务已经存在:

MTMDate0

基于我们不想生成web服务客户端的假设得出另一个答案:

我怀疑您遇到的困难与描述数据集中对象的模式有关,在该模式中,为使用此Web服务而构建的客户端会知道它需要解压缩数据集对象,然后解释结果。从中生成类的架构没有说明DataSet类的任何内容,因为它假设旧式的asp.net XML Web Service客户端已经知道了这一点。

所以我认为,你需要能够解释";有效载荷";根据它提供的架构对数据集进行的操作是创建一个XmlReader并导航到有效负载元素的开头,从而有效地剥离数据集包装。您希望将XmlReader前进到负载的根元素,跳过关联的架构,该架构只是描述而不是数据。所以你会想要这样的东西:

using (var reader = XmlReader.Create(stream)) 
{
reader.ReadToDescendant("MTM");
MTM mtmData = (MTM)serializer.Deserialize(reader);                
}

最新更新