2011-01-02 3 views
0

私はYahooジオコーディングサービス、RESTful XMLベースのサービスを使用しています。私は完全に非直列化されたXML応答を得ることができません。Yahooジオコーディングサービスから返されるタイプをデシリアライズする際に問題が発生しました。

結果のためにPlaceFinderResultSetとResultという2つのクラスを作成しました。 PlaceFinderResultSetはシンプルな型を正しくデシリアライズしますが、複合型の「Result」ノードをデシリアライズすることはできません - 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 --> 
+1

ペーストビンは質問の寿命が悪いので、サンプルXMLを質問に直接コピーしました。 XMLをもっと短くしたい場合は、コードのようにチョップしてください。 –

答えて

2

[OK]をご覧ください...

はコメントアウト[XmlType]属性が完全に、そして....これに

Result Result { get; set; } 

public Result Result { get; set; } 

GAHシリアライザがうるさいであることを、この行を変更!

+1

+1バグを見つけるために:)デフォルトのXMLシリアル化では、メンバーを公開する必要があり、それはおそらくバグの核心になります。 –

+0

優れたキャッチトム。今は完璧に動作します。 – Brian

+0

@Merlyn Yep。私はそれをシリアライズ可能とマークしていたので、フレームワークが何らかの例外を投げたならばいいでしょう。 – Brian

2

私は、次のをお勧めします:

  • ヤフーへのあなたの呼び出しのいずれかからの出力を取得し、どこかのディスクにXMLを保存する
  • ユーティリティは、Microsoft Windows SDKからこのファイルに2回だけ実行します。

MSDNのxsd.exeツールについては、よくお読みになりください。

最初の実行:

xsd.exe yahooresult.xml 

これは、XMLスキーマに結果のXMLを向けるだろう - xsd.exeは、XMLスキーマがどのように見えるかを推測するために最善を尽くしますが、あなたは見ているしたい場合がありますとにかく結果のXSDを作成し、必要に応じてそれを微調整します。

セカンドラン:

xsd.exe yahooresult.xsd /C 

これはあなたがあなたが戻ってヤフーのサービスから取得するこれらのXMLファイルをデシリアライズするために使用できるC#クラスファイルにXSDファイルをオンにします。

結果のC#ファイルが大きすぎてここに投稿できませんでしたが、投稿されたリンクから作成されたサンプルXMLを簡単に非直列化でき、そのXMLサンプルファイルから生成されたC#クラスに取り込めました。また

:クリップボードにあなたのXMLを置くと、そのメニュー項目を選択することにより

Edit > Paste XML as type 

:あなたは、Visual Studio 2008を持っていて、WCF RESTスターターキットがインストールされている場合、Visual Studioは新しいメニュー項目を備えVisual Studioに適切なC#クラスを生成させて、そのXMLを適切に非直列化することができます - 非常に便利です!

手作業のビットを使用すると、あまりにも、Visual Studioの2010年にはこれを取得することができます - 私は行くを持っていた、と私はそれがによって働いてしまったDanny Diaz' blog post on it

+0

私は消費しなければならない次のRESTサービスのための良い計画のように思えます。 – Brian

+0

+1良い一般的な解決策です。オブジェクト型を単純に変換する場合は、コード生成を行うためのツールを見つけることができれば、常にベストな方法です。 –

関連する問題