2010-04-14 2 views
0

У меня есть XML-файл, который я пытаюсь десериализовать в соответствующие объекты. Он отлично работает на большинстве этих объектов, за исключением одного элемента, который удваивается. Вот соответствующая часть XML:Унификация дескрипций XML на сущности

<Clients> 
    <Client Name="My Company" SiteID="1" 
GUID="xxx-xxx-xxx-xxx"> 
     <Reports> 
      <Report Name="First Report" Path="/Custom/FirstReport"> 
      <Generate>true</Generate> 
      </Report> 
     </Reports> 
    </Client> 
</Clients> 

«Клиенты» является List<Client> объект. Каждый объект Client имеет объект List<Report> внутри него. Проблема в том, что когда этот XML десериализован, объект List<Report> имеет счетчик 2 - объект «Первый отчет» Report находится там дважды. Зачем? Вот C#:

public class Client { 
    [System.Xml.Serialization.XmlArray("Reports"), System.Xml.Serialization.XmlArrayItem(typeof(Report))] 
    public List<Report> Reports; 
} 

public class Report { 
    [System.Xml.Serialization.XmlAttribute("Name")] 
    public string Name; 

    public bool Generate; 

    [System.Xml.Serialization.XmlAttribute("Path")] 
    public string Path; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Client> _clients = new List<Client>(); 
     string xmlFile = "myxmlfile.xml"; 
     System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(List<Client>), new System.Xml.Serialization.XmlRootAttribute("Clients")); 
     using (FileStream stream = new FileStream(xmlFile, FileMode.Open)) 
     { 
      _clients = xmlSerializer.Deserialize(stream) as List<Client>; 
     } 
     foreach(Client _client in _clients) 
     { 
      Console.WriteLine("Count: " + _client.Reports.Count); // This write "2" 
      foreach(Report _report in _client.Reports) 
      { 
       Console.WriteLine("Name: " + _report.Name); // Writes "First Report" twice 
      } 
     } 
    } 
} 

ответ

2

О, теперь я чувствую себя немного немым. Мой конструктор класса Client, когда он инициализирует объект List<Report>, добавляет к нему отчет по умолчанию. И затем XML добавляет тот, который он нашел. Таким образом, удваивает его. :: sigh ::

0

Используя этот точный код и XML, я получаю 1 пункт в _client.Reports (ориентированных на 3.5 и 4.0 и другое). Я бы удостоверился, что вы хватаете правильный XML и используете правильный класс Report. Возможно, это относится к одному в другом пространстве имен.

+0

Нет, это очень маленькая программа с пользовательским пространством имен и есть только один класс Report. Argh. –

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