2015-07-24 4 views
0

Я пытаюсь десериализовать XML-документ документации C#, начиная с узла members в фрагменте ниже.Отрисовка документации XML-комментариев C#

<?xml version="1.0"?> 
<doc> 
    <assembly> 
     <name>Licsp</name> 
    </assembly> 
    <members> 
     <member name="T:Licsp.Parsing.SExp"> 
      <summary> 
      Intermediary structure used by parser 
      </summary> 
     </member> 
    </members> 
</doc> 

Каждый member должен десериализации к DocItem; сборник members следует десериализовать до DocFile.

[XmlRoot("members")] 
public class DocFile 
{ 
    [XmlArrayItem("member", typeof(DocItem))] 
    public List<DocItem> Items = new List<DocItem>(); 
} 

[Serializable()] 
public class DocItem 
{ 
    [XmlAttribute("name")] 
    public string Name; 

    [XmlElement("summary")] 
    public string Summary; 

    [XmlElement("example")] 
    public string Example; 

    [XmlElement("remarks")] 
    public string Remarks; 
} 

Вот код вызова:

 using (var reader = new XmlTextReader(documentation)) 
     { 
      reader.ReadToDescendant("members"); 
      var deserializer = new XmlSerializer(typeof(DocFile)); 
      DocFile helpfile = (DocFile)deserializer.Deserialize(reader.ReadSubtree()); 
     } 

Я получаю обратно DocFile объект, но Items пуст. Сериализация DocFile объект производит следующие действия:

<?xml version="1.0" encoding="utf-8"?> 
<members xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Items> 
    <member name="name"> 
     <summary>summary</summary> 
     <example>example</example> 
     <remarks>remarks</remarks> 
    </member> 
    </Items> 
</members> 

Я не знаю, почему десериализации не удается. Что я делаю не так?

ответ

1

Поскольку members ваш корень и вам нужно member детей в коллекции, замените ваш [XmlArrayItem] с [XmlElement]

XmlElement может быть использован для отдельных узлов, а также катиться много узлов с тем же именем в коллекцию.

[XmlRoot("members")] 
public class DocFile 
{ 
    [XmlElement("member")] 
    public List<DocItem> Items = new List<DocItem>(); 
} 

XmlArrayItem должен быть использован в сочетании с XmlArray. Это сработало бы, если бы, например, у вас был один уровень с doc в качестве вашего корня.