Skip to main content
 首页 » 编程设计

c#之反序列化 XML Rest WebApi 调用

2024年01月18日27zhengyun_ustc

我一直在关注一些在线示例,但出于某种原因我无法成功反序列化以下 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; } 
    } 

希望对您有所帮助。