【发布时间】:2021-11-12 11:52:57
【问题描述】:
鉴于以下 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 Schema Definition,部分):
<?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=......
....
MTMDate 元素后面有更多“列”元素。
我的代码尝试反序列化以 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”看起来像 XSD(XML 模式定义),而不是实际的“内容”XML。也就是说,它是对 XML 格式的定义,而不是已经序列化为 XML 的实际数据。你真的想反序列化 that 吗?见:en.wikipedia.org/wiki/XML_Schema_(W3C)
-
嗨@Jonathan,我对 xml 和使用 Web 服务非常陌生。据我了解,我需要使用 XSD 反序列化 XSD 格式的 XML 吗?我只想将 XML 数据放入 List
-
这就是我的怀疑。是的,您使用 XSD(上图)为 XML 创建结构(类)。 Microsoft 有一个 XSD 工具来帮助生成类(请参阅:docs.microsoft.com/en-us/dotnet/standard/serialization/…)。然后你可以将提供的 XML 反序列化到你的类。
-
嗨@Jonathan,我有架构,因此手动生成类相当容易..如上面的问题所示?我认为我的问题在于反序列化步骤,还是在反序列化步骤中链接 XSD 和类?或者我错过了什么?
-
正如@Tom W 下面所说,您可以在 Visual Studio 中添加“服务引用”。在创建服务引用期间,您将指向要使用的服务,Visual Studio 将实际构建代理类以读取、反序列化等您的服务。