2013-01-09 8 views
13

con C# .Net 4 - Esempio di XML (campione reale ha 6 attributi)deserializzazione XML File con elemento più attributi - attributi non sono deserializzazione

<TestXML> 
    <TestElement attr1="MyAttr" attr2="1" DateAdded="">25</TestElement> 
</TestXML> 

Per la mia definizione di classe ho il seguente:

public class TestXML() { 
    public TestXML() {} 

    public int TestElement {get; set;} 
    [XmlAttribute] 
    public string attr1 {get; set;} 
    [XmlAttribute] 
    public string attr2 {get; set;} 
    [XmlIgnore] 
    public DateTime DateAdded {get; set;} 
    [XmlAttribute("DateAdded")] 
    public string dateadded { 
     get{ return (DateAdded == null ? "" : DateAdded.ToString();} 
     set{ if(!value.Equals("")) DateAdded = DateTime.Parse(value);} 
    } 
} 

Ora il codice di deserializzare:

string xml = "<TestXML><TestElement attr1=\"MyAttr\" attr2=\"1\" DateAdded=\"\">26</TestElement></TestXML>" 
using (StringReader sr = new StringReader(xml)) { 
    XmlSerializer serializer = new XmlSerializer(typeof(TestXML)); 
    TestXML myxml = (TestXML)serializer.Deserialize(sr); 
} 

Ora il risultato che otteniamo è (la visualizzazione di oggetti in VS):

myxml 
    attr1   | null 
    attr2   | null 
    TestElement | 25 

Perdita completa del motivo per cui gli attributi non verranno deserializzati.

+1

'' fa riferimento ** solo ** a 'pubblico int TestElement {get; set;}' –

+0

L'obiettivo di questa domanda è ottenere che il codice funzioni correttamente. Xml è formattato correttamente. –

risposta

23

Per fare questo è necessario due livelli:

[XmlRoot("TestXML")] 
public class TestXml { 
    [XmlElement("TestElement")] 
    public TestElement TestElement { get; set; } 
} 

public class TestElement { 
    [XmlText] 
    public int Value {get;set;} 

    [XmlAttribute] 
    public string attr1 {get;set;} 

    [XmlAttribute] 
    public string attr2 {get;set;} 
} 

Si noti che il > 26 < può provocare problemi anche (spazi bianchi); potrebbe essere necessario che sia una stringa invece di un int.

+0

Correggendo gli spazi attorno al valore, riformattandolo nelle due classi, tuttavia la variabile di riferimento sulla prima classe ritorna nulla; –

+0

@pyTeaParty Cambiate semplicemente: 'public TestElement {get; set;}' a: 'testElement TestElement pubblico {get; set;}'. – Mir

+0

Ahh, dimenticò che corrisponde al nome dell'elemento, quindi sì i due classe è la soluzione su mia prova più grande che vi ho ringrazio tanto @Eve –

2

Si stanno definendo gli attributi su TestElement mentre dovrebbero essere su TestXML. Esempio:

@"<TestXML attr1=""MyAttr"" attr2=""1""> 
     <TestElement>26</TestElement> 
    </TestXML>" 
+0

L'XML è corretto nella sua formattazione Sospetto che il problema sia nella definizione della classe, ma non vedo che cosa deve essere fatto in quanto altri esempi mostrano la stessa impostazione tranne con un solo attributo. –

+0

@pyTeaParty L'XML è sintatticamente corretto, ma non sappiamo se voleva che il codice si adattasse ad esso o per capire perché non funzionava. Pensavo che sarebbe stato utile sottolineare come dovrebbe essere l'XML per il suo codice. – Mir

+0

Grazie al tentativo di ottenere il codice per lavorare con l'XML è quello che sto cercando di fare. –

0

Ho appena eseguito un test di serializzazione/deserializzazione l'oggetto e sembra funzionare bene

prova:

TestXML obj = new TestXML{ attr1 = "Attrib1", attr2 = "Attrib2", DateAdded = DateTime.Now, TestElement = 44}; 

XmlSerializer serializer = new XmlSerializer(typeof(TestXML)); 
using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.OpenOrCreate)) 
{ 
    serializer.Serialize(stream, obj); 
} 

using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.Open)) 
{ 
    TestXML myxml = (TestXML)serializer.Deserialize(stream); 
} 

tutti gli attributi deserializzate ok.

Risultato:

enter image description here

Xml:

<?xml version="1.0"?> 
<TestXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" attr1="Attrib1" attr2="Attrib2" DateAdded="10/01/2013 9:46:23 a.m."> 
    <TestElement>44</TestElement> 
</TestXML> 
+0

Guardando più vicino, ti vedo serializzare prima l'oggetto. Chiaramente l'xml non corrisponde, quindi la mia definizione di classe è sbagliata. –

0

Come nota aggiuntiva per la risposta accettata. Assicurarsi che l'elemento XML non contiene un nil = "true" attributo come questo:

<TestXML> 
    <TestElement attr1="MyAttr" attr2="1" DateAdded="" xsi:nil="true">25</TestElement> 
</TestXML> 

Dalla mia esperienza il deserializzatore non deserializzare attributi di un elemento contrassegnato come null (zero).

Problemi correlati