2015-09-14 4 views
0

Я десериализую ответы XML из API.Deserialize один элемент коллекции

<?xml version="1.0" encoding="UTF-8"?> 
<categories type="array"> 
    <category> 
     <parent-id /> 
     <name>Şirketiçi</name> 
     <count type="integer">0</count> 
     <elements-count type="integer">0</elements-count> 
     <id type="integer">18940</id> 
     <type>ProjectCategory</type> 
    </category> 
</categories> 

Я могу десериализовать XML-ответ, как описано выше, используя классы ниже.

[XmlRoot("categories")] 
public class CategoriesResponse :IEntityResponse 
{ 
    public CategoriesResponse() 
    { 
     Categories = new List<Category>(); 
    } 
    [XmlElement("category")] 
    public List<Category> Categories { get; set; } 
} 

Но я также получаю ответ с одним узлом категории, как показано ниже, из API.

<?xml version="1.0" encoding="UTF-8"?> 
<category> 
    <parent-id /> 
    <name>Şirketiçi</name> 
    <count type="integer">0</count> 
    <id type="integer">18940</id> 
    <elements_count type="integer">0</elements_count> 
    <type>ProjectCategory</type> 
</category> 

Поэтому я написал класс с свойством Category для этого ответа, но не может десериализоваться.

[XmlRoot("category")] 
public class CategoryResponse 
{ 
    public CategoryResponse() 
    { 

    } 
    [XmlElement("category")] 
    public Category Category; 
    public string STATUS { get; set; } 
} 

Я хочу использовать класс категории для десериализации. Какое определение класса следует использовать для этого ответа XML.

ответ

0

Второй ответ (категория) является корневым узлом и НЕ содержит дочерний узел category. Вы должны просто десериализовать его как Category.

Я предполагаю, что ваш Category класс выглядит примерно так:

[XmlRoot("category")] 
public class Category 
{ 
    public Category() { } 

    [XmlElement("parent-id")] 
    public int ParentId {get;set} 

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

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

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

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

    [XmlElement("type")] 
    public string Type {get;set} 
} 
+0

На самом деле я знаю, что могу десериализовать класс класса, но я использую для ответов обобщенные методы на основе интерфейса IEntityResponse. Поэтому мой класс десериализации, ожидающий параметров, полученных из IEntityResponse, не является классом. Я не хочу изменять все мои методы десериализации или добавлять новые методы для классов, которые не являются производными от интерфейса. –

+0

В любом случае класс deserialize 'category' должен выглядеть аналогично классу, который я написал выше. Внедрите 'IEntityResponse', и вы должны быть настроены. Я не вижу другого реального варианта. –

0

Вам не нужно сериализовать. В этом случае я бы использовал XML Linq.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = 
       "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + 
        "<categories type=\"array\">" + 
         "<category>" + 
          "<parent-id />" + 
          "<name>Şirketiçi</name>" + 
          "<count type=\"integer\">0</count>" + 
          "<elements-count type=\"integer\">0</elements-count>" + 
          "<id type=\"integer\">18940</id>" + 
          "<type>ProjectCategory</type>" + 
         "</category>" + 
        "</categories>"; 

      XDocument doc = XDocument.Parse(input); 
      List<Category> categories = new List<Category>(); 

      foreach (XElement category in doc.Descendants("category")) 
      { 
       Category newCategory = new Category(); 
       categories.Add(newCategory); 
       newCategory.parentID = category.Element("parent-id") == null ? null : category.Element("parent-id").Value.Length == 0 ? null : (int?)category.Element("parent-id"); 
       newCategory.name = category.Element("name") == null ? null : category.Element("name").Value.Length == 0 ? null : (string)category.Element("name"); 
       newCategory.count = category.Element("count") == null ? null : category.Element("count").Value.Length == 0 ? null : (int?)category.Element("count"); 
       newCategory.elementsCount = category.Element("elements-count") == null ? null : category.Element("elements-count").Value.Length == 0 ? null : (int?)category.Element("elements-count"); 
       newCategory.id = category.Element("id") == null ? null : category.Element("id").Value.Length == 0 ? null : (int?)category.Element("id"); 
       newCategory._type = category.Element("type") == null ? null : (string)category.Element("type"); 
      } 

     } 
     public class Category 
     { 
      public int? parentID { get; set; } 
      public string name { get; set; } 
      public int? count { get; set; } 
      public int? elementsCount { get; set; } 
      public int? id { get; set; } 
      public string _type { get; set; } 

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