2010-01-28 2 views
2

У меня есть XML, который возвращается на 3-й участник веб-службы в следующем виде:десериализации трудно формируется XML для C объекта #

<object> 
    <list name="subscriptions"> 
     <object> 
      <string name="id">something</string> 
      <string name="title">something else</string> 
      <list name="categories" /> 
      <number name="timestamp">1252707770116</number> 
     </object> 
     ...more 'object'... 
    </list> 
</object> 

У меня много вопросов, пытающихся десериализации эти данные объекта , Я не был в состоянии создать схему с помощью xsd.exe, поэтому я создал следующие классы вручную, чтобы попытаться соответствовать этим данным:

[XmlRoot("object")] 
public class ListOfSubscriptions 
{ 
    [XmlElement("list")] 
    public Subscription[] items; 
} 

[XmlRoot("object")] 
public class Subscription 
{ 
    [XmlAttribute()] 
    public string id; 
    [XmlAttribute()] 
    public string title; 
    [XmlAttribute()] 
    public string[] categories; 
    [XmlAttribute()] 
    public string timestamp; 
} 

Я пытаюсь десериализации с помощью следующего кода:

XmlSerializer s = new XmlSerializer(typeof(ListOfSubscriptions)); 
StreamReader r = new StreamReader("out.xml"); 
ListOfSubscriptions listSubscribe = (ListOfSubscriptions)s.Deserialize(r); 
r.Close(); 

Однако, когда он заканчивается, listSubscribe имеет один элемент и все его поля равны нулю.

Как я могу создать свой шаблон для десериализации?

Благодаря

Update - 2010/01/28

Благодаря комментарии у всех я пересмотрел свои классы на следующее:

[XmlRoot("object")] 
public class ListOfSubscriptions 
{ 
    [XmlElement("list")] 
    public SubscriptionList[] items; 
} 
[XmlRoot("list")] 
public class SubscriptionList 
{ 
    [XmlElement("object")] 
    public Subscription[] items; 
} 

[XmlRoot("object")] 
public class Subscription 
{ 
    [XmlElement("string")] 
    public string id; 
    [XmlElement("string")] 
    public string title; 
    [XmlElement("list")] 
    public string[] categories; 
    [XmlElement("number")] 
    public string timestamp; 
} 

Если я закомментировать [XmlElement (...)] в подписке и запустить, я получаю, что listSubscribe имеет один элемент SubscriptionList, который имеет правильное количество подписей, однако все элементы подписки являются нулевыми.

Если я раскомментирую строки XmlElement, я получаю сообщение об ошибке, соответствующее подписке. Я предполагаю, что его запутали, потому что есть несколько элементов с тем же именем.

Как привязать имя атрибута к члену класса?

ответ

4

Вы на правильном пути. Однако вы определяете только два класса. На самом деле существует три класса для определения:

  1. Единственный корневой объект с XML-именем «объект». У этого будет только один член:
  2. Список объектов (с XML-названием «список»). У этого будет один член, массив из:
  3. Подписки с XML-именем «объект».

Другая проблема заключается в том, что вы определяете поля Subscription как атрибуты. Они не атрибуты, они элементы.

+0

Спасибо, это меня намного ближе, у меня все еще есть проблемы с получением данных в объект Subscription, я добавил детали в исходное сообщение. – Aaron

+0

Я собираюсь пойти дальше и принять этот ответ, он заставил меня ближе всех. Я нашел, что могу получить данные в Json, поэтому я использую библиотеку Json.NET для решения проблемы десериализации. Благодарю. – Aaron

0

Вы должны изменить XmlArry и XMLArrayItem.

Here - пример.Это должно выглядеть примерно так:

[XmlArray("FullNames")] 
[XmlArrayItem("Name")] 
public string[] Names{get;set;} 

даст вам

<FullNames> 
    <Name>Michael Jackson</Name> 
    <Name>Paris Hilton</Name> 
</FullNames> 
2

Вы никогда не собираетесь получить в любом месте с XML, как это:

<string name="id">something</string> 

Вот только что созданный кем-то, кто не знает XML. Эквивалент:

<id>something</id> 

было бы легко десериализовать.


Единственный способ, которым я могу думать, чтобы вы десериализации что путем реализации интерфейса IXmlSerializable вашего класса (ов).

+0

Я согласен с тем, что XML будет легко десериализоваться, однако XML, который я получил от Google, вы думаете, что они будут лучше знать. – Aaron

+0

@ Аарон: нет, я думаю, что они не рассматривают людей, которые хотят десериализовать объект. Они могут ожидать, что вы обработаете XML напрямую. –

+0

Я думал, что что-то не так в этом XML. Рад узнать, что это был не только я. –

0

Я считаю, что вы можете использовать утилиту XSD.exe .Net для генерации класса, который может быть использован в представлении памяти вашего XML-документа.

+0

XSD не придумал ничего полезного, я думаю, что его из-за формы XML – Aaron

Смежные вопросы