将Web API的XML响应反序列化为控制台应用程序

时间:2015-01-17 04:18:21

标签: c# .net xml asp.net-web-api deserialization

从控制台应用程序,我调用Web API。 API以XML格式返回IEnumerable<Foo>。 XML响应如下所示:

<ArrayOfFoo xmlns:i="..." xmlns="....">
    <Foo>
        <Member1>First Foo</Member1>
        <Member2>Yes</Member2>
        ...
    </Foo>

    <Foo>
        ...
    </Foo>
</ArrayOfFoo>

当我尝试在控制台应用中将其反序列化为List<Foo>时,它无法正常工作。报告的例外是:

<ArrayOfFoo xmlns='http://schemas.datacontract.org/2004/07/TheFooThing.Model'>不是预期的。

这是我用来反序列化响应的代码:

string xml;
using(var reader = new StreamReader(responseStream))
{
    xml = reader.ReadToEnd();
}

// deserialize into shape IEnumerable<T>
var listOfFoos = new List<Foo>();
var resultType = listOfFoos.GetType();
var serializer = new XmlSerializer(resultType);

var doc = XDocument.Parse(xml);
using(var reader = doc.CreateReader())
{
    listOfFoos = serializer.Deserialize(reader) as List<Foo>;
}

return listOfFoos;

注意:我使用旧HttpWebRequest发出HTTP请求并从API获取响应。没有特别的理由选择此而不是选择HTTPClient

1 个答案:

答案 0 :(得分:0)

看起来这是DataContractSerializer而不是XmlSerializer生成的。前者使用http://schemas.datacontract.org/2004/07/Clr.Namespace作为其默认名称空间,而XmlSerializer默认情况下不指定默认名称空间。您可以切换到DataContractSerializer,或将正确的默认命名空间传递给XmlSerializer constructor

string xml;
using(var reader = new StreamReader(responseStream))
{
    xml = reader.ReadToEnd();
}

var serializer = new XmlSerializer(typeof(List<Foo>), "http://schemas.datacontract.org/2004/07/TheFooThing.Model");
using (var reader = new StringReader(xml))
{
    var listOfFoos = serializer.Deserialize(reader) as List<Foo>;
    return listOfFoos;
}