Возникла проблема с десериализацией типов, возвращаемых службой геокодирования Yahoo - PullRequest
0 голосов
/ 02 января 2011

Я работаю со службой геокодирования Yahoo, службой на основе RESTful XML.Я не могу получить полностью десериализованный ответ XML.

Я создал два класса для результата: PlaceFinderResultSet и Result.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, который я пытаюсь десериализовать:1006 *

<?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 ]

2 голосов
/ 03 января 2011

Хорошо, у меня все получилось, и я получил его с помощью ...

Полностью закомментировав атрибут [XmlType], и .... измени эту строку:

Result Result { get; set; }

к этому:

public Result Result { get; set; }

Гах, что сериализатор придирчив!

2 голосов
/ 03 января 2011

Я бы порекомендовал следующее:

  • захватите выходные данные одного из ваших звонков в Yahoo и сохраните XML на вашем диске где-нибудь
  • , затем запустите утилиту xsd.exe изMicrosoft Windows SDK поверх этого файла дважды

Прочтите об инструменте xsd.exe в MSDN - это отличная возможность сэкономить время!

Первый запуск:

xsd.exe yahooresult.xml

Это превратит полученный XML в XML-схему - xsd.exe сделает все возможное, чтобы угадать, как должна выглядеть XML-схема, но вы все равно можете захотеть взглянуть на получившийся XSD и настроить его.это, где необходимо.

Второй запуск:

xsd.exe yahooresult.xsd /C

Это превратит XSD-файл в файл класса C #, который затем можно использовать для десериализации тех XML-файлов, которые вы получаете от Yahooservice.

Полученный файл C # слишком велик для размещения здесь, но я легко смог десериализовать образец XML, созданный по вашей опубликованной ссылке, и мне удалось получить его в класс C #, сгенерированный из этого XMLфайл образца.

Также: если у вас есть Visual Studio 2008, и у вас установлен начальный комплект WCF REST, Visual Studio имеет новый пункт меню:

Edit > Paste XML as type

Поместив XML в буфер обмена и выбрав это менюКроме того, Visual Studio может сгенерировать для вас хороший класс C #, который будет правильно десериализовать этот XML - очень удобно!

Немного потрудившись вручную, вы можете получить это и в Visual Studio 2010 - см. Пост в блоге Дэнни Диаса

...