C#获取REST xml到对象的反序列化编码冲突
我想从http获取xml文件并将其转换为对象。 现在我有两种方法:一种是获取http响应体,如下所示:C#获取REST xml到对象的反序列化编码冲突,c#,xml,serialization,encoding,uwp,C#,Xml,Serialization,Encoding,Uwp,我想从http获取xml文件并将其转换为对象。 现在我有两种方法:一种是获取http响应体,如下所示: var httpClient = new HttpClient(); var op = httpClient.GetStringAsync(uri); var httpResponseBody = ""; try { var httpResponse = await httpClient.GetAsync(uri); httpResponse.EnsureSuccessStat
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
在
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
s的集合,此组合起作用:
[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);
}
XmlSerializer reader=newxmlserializer(typeof(List),newxmlrootattribute(“ramowka”);
使用(MemoryStream stream=newmemoryStream(Encoding.UTF8.GetBytes(Xml)))
{
列表计划=(列表)读取器。反序列化(流);
}
Schedule
类刚刚从等式中消失
在HTML中转义
\n
是XML结构的一部分,因此无需担心这些。反序列化程序将\u0082
转换为其等效字符,即
. 你可能不想要。
Å
看起来也不合适——它是挪威字母表中的最后一个字母,在波兰语、阿拉伯语中没有使用。在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
s的集合,此组合起作用:
[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);
}
XmlSerializer reader=newxmlserializer(typeof(List),newxmlrootattribute(“ramowka”);
使用(MemoryStream stream=newmemoryStream(Encoding.UTF8.GetBytes(Xml)))
{
列表计划=(列表)读取器。反序列化(流);
}
Schedule
类刚刚从等式中消失
在HTML中转义
\n
是XML结构的一部分,因此无需担心这些。反序列化程序将\u0082
转换为其等效字符,即
. 你可能不想要。
Å
看起来也不合适——这是挪威字母表中的最后一个字母,在波兰语中没有使用。我将Schedule类更改为:
[XmlType(AnonymousType = true)]
[XmlRootAttribute("ramowka")]
public class Schedule
{
[XmlElementAttribute("dzien")]
public ScheduleDay[] AuditionDays { get; set; }
}
现在它看起来像在工作。感谢Petter对Root属性的提示。我已将Schedule类更改为:
[XmlType(AnonymousType = true)]
[XmlRootAttribute("ramowka")]
public class Schedule
{
[XmlElementAttribute("dzien")]
public ScheduleDay[] AuditionDays { get; set; }
}
现在它看起来像在工作。感谢Petter对Root属性的提示。Schedule类是什么样子的?Schedule类是什么样子的?我只给出了一个示例,但其中有更多的标记。如何处理它?我只给出了一个示例,但其中有更多的标记。如何处理它比?