对Web API中的XML字符串进行反序列化
本文关键字:反序列化 字符串 XML Web API 中的 | 更新日期: 2023-09-27 17:58:37
我正在使用C#,并且有一个关于反序列化XML字符串的问题。
以下是我要反序列化的代码:
public object XmlDeserializeFromString(string objectData, Type type)
{
var serializer = new XmlSerializer(type);
object result;
using (TextReader reader = new StringReader(objectData))
{
result = serializer.Deserialize(reader);
}
return result;
}
以下XML与上述函数配合使用:
<House>
<address>21 My House</address>
<id>1</id>
<owner>Optimation</owner>
</House>
然而,我的Web API应用程序中的XML并不:
<House xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MVCwithWebAPIApplication.Models">
<address>21 My House</address>
<id>1</id>
<owner>Optimation</owner>
</House>
如何从Web API应用程序中获取XmlDeserializeFromString
函数来处理XML?
从web api返回的xml内部有一个默认名称空间。要将此xml反序列化为内存对象(由c#类定义),XmlSerialize必须知道该类是否属于该命名空间。这是由附加到该类的RootAttribute中的属性"Namespace"指定的。如果xml中的命名空间与c#类中声明的命名空间匹配,则xml被成功反序列化。否则反序列化失败。
有关xml命名空间的更多信息,请参阅http://www.w3schools.com/xml/xml_namespaces.asp
下面是演示解决方案供您参考。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;
namespace ConsoleApplication8 {
class Program {
static void Main(string[] args) {
var s1 = "<House><address>21 My House</address><id>1</id><owner>Optimation</owner></House>";
var s2 = "<House xmlns:i='"http://www.w3.org/2001/XMLSchema-instance'" xmlns='"http://schemas.datacontract.org/2004/07/MVCwithWebAPIApplication.Models'"><address>21 My House</address><id>1</id><owner>Optimation</owner></House>";
House house = (House)XmlDeserializeFromString(s2, typeof(House));
Console.WriteLine(house.ToString());
Console.Read();
}
public static Object XmlDeserializeFromString(string objectData, Type type) {
var serializer = new XmlSerializer(type);
object result;
using (TextReader reader = new StringReader(objectData)) {
result = serializer.Deserialize(reader);
}
return result;
}
}
//this is the only change
[XmlRoot(Namespace="http://schemas.datacontract.org/2004/07/MVCwithWebAPIApplication.Models")]
public class House {
public String address { get; set; }
public String id { get; set; }
public String owner { get; set; }
public override string ToString() {
return String.Format("address: {0} id: {1} owner: {2}", address, id, owner);
}
}
}