2016-10-31 6 views
1

Я пытаюсь десериализовать xml в объект, но он не проходит через xml правильно. Он не заполняет авторов в объекте. Я пытаюсь вернуть объект, состоящий из статей, содержащих заголовок и список авторов. Список авторов не будет заполняться в этом коде, что является моей проблемой. пожалуйста, помогите, поскольку я новичок в этой обработке XML.Deserialization XML для объекта со списками

Здесь вы можете увидеть эту проблему. enter image description here

Вот образец xml.

<?xml version="1.0" encoding="UTF-8"?> 
<MedlineCitationSet> 
<Article> 
    <ArticleTitle>Title 1</ArticleTitle> 
    <AuthorList> 
     <Author> 
      <LastName>Public</LastName> 
      <ForeName>J Q</ForeName> 
      <Initials>JQ</Initials> 
     </Author> 
     <Author> 
      <LastName>Doe</LastName> 
      <ForeName>John</ForeName> 
      <Initials>J</Initials> 
     </Author> 
    </AuthorList> 
</Article> 
<Article> 
    <ArticleTitle>Title 2</ArticleTitle> 
    <AuthorList> 
     <Author> 
      <LastName>Doe</LastName> 
      <ForeName>John</ForeName> 
      <Initials>J</Initials> 
     </Author> 
     <Author> 
      <LastName>Doe</LastName> 
      <ForeName>Jane</ForeName> 
      <Initials>J</Initials> 
     </Author> 
    </AuthorList> 
</Article> 
<Article> 
    <ArticleTitle>Title 3</ArticleTitle> 
    <AuthorList> 
     <Author> 
      <LastName>Doe</LastName> 
      <ForeName>Jane</ForeName> 
      <Initials>J</Initials> 
     </Author> 
     <Author> 
      <LastName>Public</LastName> 
      <ForeName>J Q</ForeName> 
      <Initials>JQ</Initials> 
     </Author> 
    </AuthorList> 
</Article> 
<Article> 
    <ArticleTitle>Title 4</ArticleTitle> 
    <AuthorList> 
     <Author> 
      <LastName>Smith</LastName> 
      <ForeName>John</ForeName> 
      <Initials>J</Initials> 
     </Author> 
     <Author> 
      <LastName>Doe</LastName> 
      <ForeName>John</ForeName> 
      <Initials>J</Initials> 
     </Author> 
    </AuthorList> 
</Article> 

Вот мой класс иерархии.

[XmlRoot("MedlineCitationSet")] 
public class MedlineCitationSet 
{ 
    [XmlElement("Article")] 
    public List<Article> Articles { get; set; } 
} 

[XmlRoot("Article")] 
public class Article 
{ 
    [XmlElement("ArticleTitle")] 
    public string ArticleTitle { get; set; } 

    [XmlElement("AuthorList")] 
    public List<Author> AuthorList { get; set; } 
} 

public class Author 
{ 
    [XmlElement("LastName")] 
    public string LastName { get; set; } 

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

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

И вот мой код десериализации.

XmlSerializer serializer = new XmlSerializer(typeof(MedlineCitationSet)); 
using (FileStream fileStream = new FileStream(newPath + @"\XmlToRead\XmlToRead.xml", FileMode.Open)) 
{ 
    MedlineCitationSet result = (MedlineCitationSet)serializer.Deserialize(fileStream); 
} 

ответ

3

Эта часть:

[XmlElement("AuthorList")] 
public List<Author> AuthorList { get; set; } 

Указывает, что сериализатором обрабатывает каждый элемент <AuthorList> как автор, а дополнительный уровень <Author> в вашем XML.

Эту проблему можно решить следующим образом:

[XmlArray("AuthorList")] 
[XmlArrayItem("Author")] 
public List<Author> AuthorList { get; set; } 

PS. Вы можете легко увидеть, что делает сериализатор вашего текущего сопоставления сериализации, создавая код MedlineCitationSet и сериализуя его.

+0

Это разрешает мою проблему. Атрибуты объекта теперь успешно заполняются. Большое спасибо. –

0

Вы должны использовать [XmlType ("MedlineCitationSet")] [XmlType ("Статья")] и [XmlType ("Автор")] в качестве атрибутов в классах, я вижу, что не хватает по крайней мере определение XML в классе Автор.

+0

Эти атрибуты являются избыточными. Поскольку типы используют друг друга напрямую, «XmlSerializer» может использовать это соединение без дальнейшего объявления. – Georg

0

Попробуйте добавить XmlArrayItem -трибут в категорию AuthorList.

0

Попробуйте использовать атрибуты xmlroot для класса автора и повторите попытку. Вы можете удалить атрибут ail décaissé из того, что xmlserializer May bé automatic.