对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字符串进行反序列化

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