【问题标题】:C# GET REST xml to object deserialization encoding clashC# GET REST xml 到对象反序列化编码冲突
【发布时间】:2016-01-26 19:05:17
【问题描述】:

我想从 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

如何去掉 '\n' 和 Å\u0082 (应该是 ł) ? 现在我收到来自reader.Deserialize 的异常:{"&lt;ramowka xmlns=''&gt; was not expected."}

课程安排:

[XmlType(AnonymousType = true)]
[XmlRootAttribute(Namespace = "", IsNullable = false)]
public class Schedule
{
    [XmlElementAttribute("ramowka")]
    public ScheduleDay[] AuditionDays { get; set; }
}

【问题讨论】:

  • Schedule 类是什么样的?

标签: c# xml serialization encoding uwp


【解决方案1】:

我已将 Schedule 课程更改为:

[XmlType(AnonymousType = true)]
[XmlRootAttribute("ramowka")]
public class Schedule
{
    [XmlElementAttribute("dzien")]
    public ScheduleDay[] AuditionDays { get; set; }
}

现在它看起来可以工作了。感谢 Petter 提供 Root 属性的提示。

【讨论】:

    【解决方案2】:

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

    我还没有尝试过你的,但是这些工作。


    对于ScheduleDays 的集合,此组合有效:

    [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 中的转义

    \ns 是 XML 结构的一部分,因此无需担心这些。解串器会将\u0082 翻译成它的等效字符,即 BREAK PERMITTED HERE。你可能不想要。 Å 看起来也不合适——它是挪威字母表的最后一个字母,在波兰语 AFAIK 中没有使用。

    【讨论】:

    • 我只给出了示例,但 中有更多 标签。怎么处理呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多