2013-08-02 14 views
9

Jest to strumień xml:deserialising nie działa

<?xml version="1.0" encoding="utf-8" ?> 
<historydetails> 
    <taskEvent> 
     <eventtype>Transitions</eventtype> 
     <historyevent>Task moved</historyevent> 
     <details>From 'Requested' to 'In Validation'</details> 
     <author>NAme</author> 
     <entrydate>01 Jul 13, 11:34</entrydate> 
     <historyid>2620</historyid> 
    </taskEvent> 
    <taskEvent> 
     <eventtype>Updates</eventtype> 
     <historyevent>Subtask marked done</historyevent> 
     <details>Subtask: visualise status and versions</details> 
     <author>NAme2</author> 
     <entrydate>21 Jun 13, 10:16</entrydate> 
    <historyid>2588</historyid> 
    </taskEvent> 
</historydetails> 

analogicznym klas wyglądać następująco:

public class historydetails 
{ 
    [XmlElement("taskEvent")] 
    List<taskEvent> eventList = new List<taskEvent>(); 
} 

public class taskEvent 
{ 
    string eventtype { get; set; } 
    string historyevent { get; set; } 
    string details { get; set; } 
    string author { get; set; } 
    string entrydate { get; set; } 
    string historyid { get; set; } 
} 

kod do deserialise xml (wymiana ciąg zawiera kod XML):

XmlSerializer deserializer = new XmlSerializer(typeof(historydetails));        
object obj = obj = deserializer.Deserialize(stringToStream(replacement));   
historydetails XmlData = (historydetails)obj; 

metoda stringToStream

private MemoryStream stringToStream(string input) 
{ 
    byte[] byteArray = Encoding.ASCII.GetBytes(input); 
    MemoryStream stream = new MemoryStream(byteArray); 
    return stream; 
} 

Wynik, który otrzymuję, jest następujący: Obiekt XmlData został utworzony i znajduje się lista eventEvents. Problem jest w samym liście: jest pusty ...

+3

Czy próbowali wypełniania obiektowi siebie i szeregowania go do XML do porównania? Jeśli jest to problem z hierarchią twoich elementów, zauważysz natychmiast. –

+0

Pytania, w których "to nie działa" są prawie niemożliwe do odpowiedzi, chyba że spróbujesz {/ * nie powiodło się * /} catch (Exception ex) {ex.ToString(); } 'i dodaj wynik' ToString' do twojego pytania. – Will

+1

Czy on nie dostanie błędu. Otrzymuje prawidłowy obiekt XML, ale jest pusty. – BlargleMonster

Odpowiedz

10

Trzeba dokonać członków publicznych

public class historydetails 
{ 
    [XmlElement("taskEvent")] 
    public List<taskEvent> eventList = new List<taskEvent>(); 
} 

    public class taskEvent 
{ 
    public string eventtype { get; set; } 
    public string historyevent { get; set; } 
    public string details { get; set; } 
    public string author { get; set; } 
    public string entrydate { get; set; } 
    public string historyid { get; set; } 
} 
4

Tak na marginesie, do wykorzystania w przyszłości (z Visual Studio 2012 lub wtyczki WebEssentials) , jednym z najprostszych sposobów tworzenia klas na podstawie przykładowych danych XML jest skopiowanie go do schowka, a następnie użycie wbudowanej funkcji VS: EDYCJA -> Wklej specjalnie -> Wklej XML jako klasę w nowy plik klasy.

  • To pozostawia mniej miejsca na błędy, takie jak ta, którą spotkałem i
  • Jest szybki, będziesz miał swoje zajęcia gotowy w ciągu kilku sekund
+0

czy to wykorzystuje narzędzie generatora XSD? – Aphelion

+1

Dobre pytanie, nie jestem pewien w tej chwili. Rozglądałem się w IL na potrzeby wdrożenia, ale zrezygnowałem. Byłoby interesujące wiedzieć, jak to się robi. –