遇到问题反序列化Yahoo地理编码服务返回的类型

时间:2011-01-02 20:44:33

标签: c# xml wcf yahoo wcf-client

我正在使用Yahoo地理编码服务,这是一种基于REST的XML服务。我无法完全反序列化XML响应。

我为结果创建了两个类:PlaceFinderResultSet和Result。 PlaceFinderResultSet正确反序列化简单类型,但我无法将反序列“结果”节点反序列化 - 我的Result属性为null。

[XmlRoot(ElementName="ResultSet")]
public class PlaceFinderResultSet
{

    [XmlElement("Error")]
    public int Error { get; set; }

    [XmlElement("ErrorMessage")]
    public string ErrorMessage { get; set; }

    [XmlElement("Locale")]
    public string Locale { get; set; }

    [XmlElement("Quality")]
    public int Quality { get; set; }

    [XmlElement("Found")]
    public bool Found {get;set;}

    [XmlElement("Result",Type=typeof(Result),DataType="Result")]
    Result Result { get; set; }
}

[XmlRoot(ElementName = "")]
[XmlType(Namespace = "http://www.tempuri.com", TypeName = "Result")]
public class Result
{
    [XmlElement("quality")]
    public int Quality{get;set;}

    [XmlElement("latitude")]
    public double Latitude{get;set;}

    /** the rest of the code was omitted for brevity **/
 }

以下是我尝试反序列化的XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<ResultSet version="1.0">
    <Error>0</Error>
    <ErrorMessage>No error</ErrorMessage>
    <Locale>us_US</Locale>
    <Quality>99</Quality>
    <Found>1</Found>
    <Result>
        <quality>72</quality>
        <latitude>50.000000</latitude>
        <longitude>-77.000000</longitude>
        <offsetlat>50.000000</offsetlat>
        <offsetlon>-77.000000</offsetlon>
        <radius>500</radius>
        <name>50 -77</name>
        <line1>Route de la Baie-James</line1>
        <line2>Baie-James, QC  J0Y</line2>
        <line3></line3>
        <line4>Canada</line4>
        <house></house>
        <street>Route de la Baie-James</street>
        <xstreet></xstreet>
        <unittype></unittype>
        <unit></unit>
        <postal>J0Y</postal>
        <neighborhood></neighborhood>
        <city>Baie-James</city>
        <county>Baie-James</county>
        <state>Quebec</state>
        <country>Canada</country>
        <countrycode>CA</countrycode>
        <statecode>QC</statecode>
        <countycode></countycode>
        <hash></hash>
        <woeid>12697261</woeid>
        <woetype>11</woetype>
        <uzip>J0Y</uzip>
    </Result>
</ResultSet>
<!-- gws26.maps.sp1.yahoo.com uncompressed/chunked Sun Jan  2 12:54:55 PST 2011 -->

2 个答案:

答案 0 :(得分:2)

我会推荐以下内容:

  • 从您对Yahoo的一次调用获取输出并将XML存储在您的磁盘上
  • 然后通过此文件两次从Microsoft Windows SDK运行xsd.exe实用程序

了解MSDN上的xsd.exe工具 - 这是一个很好的节省时间!

首先运行:

xsd.exe yahooresult.xml

这会将结果XML转换为XML架构 - xsd.exe将尽力猜测XML架构应该是什么样子,但您可能想要查看生成的XSD,并调整它,必要时。

第二轮:

xsd.exe yahooresult.xsd /C

这会将XSD文件转换为C#类文件,然后您可以使用该文件反序列化从Yahoo服务中获取的XML文件。

生成的C#文件太大,无法在此处发布,但我可以轻松地反序列化从发布的链接创建的示例XML,并且我能够将其转换为从该XML示例文件生成的C#类。

此外:如果您安装了Visual Studio 2008并且安装了WCF REST入门工具包,Visual Studio将提供一个新的菜单项:

Edit > Paste XML as type

通过将XML放到剪贴板然后选择该菜单项,您可以让Visual Studio为您生成一个很好的C#类,以便正确地反序列化该XML - 非常方便!

通过一些手动工作,您也可以在Visual Studio 2010中获得此功能 - 请参阅Danny Diaz' blog post on it

答案 1 :(得分:2)

好的,我有一个去,我让它工作......

完全评论[XmlType]属性,并......改变这一行:

Result Result { get; set; }

到此:

public Result Result { get; set; }

Gah,序列化器很挑剔!