c# - 反序列化 XML Rest WebApi 调用?

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

我一直在关注一些在线示例,但出于某种原因我无法成功反序列化以下 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<result>
    <postcode>BD1 1LT</postcode>
    <geo>
        <lat>53.793063240118215</lat>
        <lng>-1.7540318423563699</lng>
        <easting>416300.0</easting>
        <northing>433000.0</northing>
        <geohash>http://geohash.org/gcwf00dz21g1</geohash>
    </geo>
    <administrative>
        <council>
            <title>Bradford</title>
            <uri>http://statistics.data.gov.uk/id/statistical-geography/E08000032</uri>
            <code>E08000032</code>
        </council>
        <ward>
            <title>City</title>
            <uri>http://statistics.data.gov.uk/id/statistical-geography/E05001347</uri>
            <code>E05001347</code>
        </ward>
        <constituency>
            <title>Bradford West</title>
            <uri>http://statistics.data.gov.uk/id/statistical-geography/E14000589</uri>
            <code>E14000589</code>
        </constituency>
    </administrative>
</result>

我尝试了各种组合:

[DataContract(Name = "result", Namespace = "")]
public class Result
{
    [DataMember(Name = "postcode")]
    public string Postcode { get; set; }
    [DataMember(Name = "geo")]
    public Geo Geo { get; set; } 
}

[DataContract(Name = "geo")]
public class Geo
{
    [DataMember(Name = "lat")]
    public string Lat { get; set; } 
}

但我只能得到邮政编码,除此之外别无他物。 上面 是我拥有的 工作 atm

下面是我根据一些例子整理的:

    [Test]
    public void TestRestCall()
    {
        var url = "http://uk-postcodes.com/postcode/";
        var urlParameters = "bd11lt.xml";
        var client = new HttpClient();
        client.BaseAddress = new Uri(url);

        // Add an Accept header for JSON format.
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

        // List data response.
        HttpResponseMessage response = client.GetAsync(urlParameters).Result;  // Blocking call!
        if (response.IsSuccessStatusCode)
        {
            // Parse the response body. Blocking!
            var dataObjects = response.Content.ReadAsAsync<Result>().Result;
            //Console.WriteLine("{0}", dataObjects.Geo.);
        }
        else
        {
            Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
        } 
    }

更新:

Geo 属性为 null,这是我所能得到的。

最佳答案

我看到了两个问题。一个与排序有关,另一个与命名空间有关。

您需要指定所有属性和对象的顺序,但您还需要指定所有它们的命名空间。

    [DataContract(Name = "result", Namespace = "")]
    public class Result
    {
        [DataMember(Name = "postcode", Order = 1)]
        public string Postcode { get; set; }

        [DataMember(Name = "geo", Order = 2)]
        public Geo Geo { get; set; }
    }

同样,在您的 GEO 对象上,您必须指定两者才能使映射在 HttpClient 上工作。

    [DataContract(Name = "geo", Namespace = "")]
    public class Geo
    {
        [DataMember(Name = "lat", Order = 1)]
        public string Lat { get; set; }
    }

希望对您有所帮助。

关于c# - 反序列化 XML Rest WebApi 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28463605/

相关文章:

c# - 将多个对象从 Angular Controller 发布到 Web API 2

c# - ASP.NET MVC 将 ViewResult 作为 html 文件返回

c - 是否有用于嵌入式 C 项目的小型 XML 解析器?

c# - HttpWebRequest GET 请求在处理时停止

java - 在 Java 中使用 SAX 解析大型 XML

java - 如何使用 getElementsByTagName 获取值

javascript - 通过 WebApi 将媒体批量上传到 Azure Blob 存储

ASP.NET Web API : OAuth service provider

c# - Directory.EnumerateFiles 和 File.Exists 忽略 native DLL 文件

c# - SQL插入一行或多行数据?