C# GET REST XML 到对象反序列化编码冲突
本文关键字:反序列化 编码 冲突 对象 GET REST XML | 更新日期: 2023-09-27 18:32:03
我想从http获取xml文件并将其转换为对象。所以现在我有 2 种方法:一种是像这样获取 http 响应体的方法:
var httpClient = new HttpClient();
var op = httpClient.GetStringAsync(uri);
var httpResponseBody = "";
try {
var httpResponse = await httpClient.GetAsync(uri);
httpResponse.EnsureSuccessStatusCode();
httpResponseBody = await httpResponse.Content.ReadAsStringAsync();
return httpResponseBody;
}
...
返回字符串 httpResponseBody。第二个尝试将字符串中的这个 xml 转换为对象:
res = await task;
var reader = new XmlSerializer(typeof(Schedule));
using (var tr = new MemoryStream(Encoding.UTF8.GetBytes(res)))
{
var schedule = (Schedule)reader.Deserialize(tr);
return schedule;
}
问题是我收到的内容采用不同的编码,我不知道如何转换它以使反序列化成为可能。
我得到这样的东西:
<?xml version='"1.0'" encoding='"UTF-8'"?>'n<ramowka><dzien name='"PoniedziaÅ'u0082ek'" count='"2'"/></ramowka>'n
如何摆脱"'"和 Å''u0082(应该是 ł)?现在我收到来自reader.Deserialize
的异常:{"<ramowka xmlns=''> was not expected."}
安排课程:
[XmlType(AnonymousType = true)]
[XmlRootAttribute(Namespace = "", IsNullable = false)]
public class Schedule
{
[XmlElementAttribute("ramowka")]
public ScheduleDay[] AuditionDays { get; set; }
}
我已将计划类更改为:
[XmlType(AnonymousType = true)]
[XmlRootAttribute("ramowka")]
public class Schedule
{
[XmlElementAttribute("dzien")]
public ScheduleDay[] AuditionDays { get; set; }
}
现在看起来可以工作了。感谢彼得对根属性的提示。
在XmlSerializer
上设置根对象可以解决此问题:
var reader = new XmlSerializer(typeof(Schedule), new XmlRootAttribute("ramowka"));
。虽然我使用了略有不同的属性:
[DataContract]
public class ScheduleDay
{
[DataMember, XmlAttribute]
public string name { get; set; }
[DataMember, XmlAttribute]
public string count { get; set; }
}
[DataContract]
public class Schedule
{
[DataMember]
public ScheduleDay dzien { get; set; }
}
我还没有尝试过你的,但这些工作。
对于ScheduleDay
的集合,此组合有效:
[XmlType("dzien")]
public class ScheduleDay
{
[XmlAttribute]
public string name { get; set; }
[XmlAttribute]
public string count { get; set; }
}
用法:
XmlSerializer reader = new XmlSerializer(typeof(List<ScheduleDay>), new XmlRootAttribute("ramowka"));
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(Xml)))
{
List<ScheduleDay> schedule = (List<ScheduleDay>)reader.Deserialize(stream);
}
Schedule
类刚刚从等式中消失了。
HTML 中的转义
'n
是 XML 结构的一部分,因此无需担心这些。反序列化程序会将'u0082
转换为其等效字符,即此处允许休息。你可能不想要。Å
看起来也不合适 - 它是挪威字母表的最后一个字母,没有在波兰语AFAIK中使用。