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; }
}

C# GET REST XML 到对象反序列化编码冲突

我已将计划类更改为:

[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中使用。