2012-03-26 15 views
3

Ich möchte Fragen für Quiz importieren, die in XML-Datei sind. Es gibt eine Liste von Fragen in XML, und jede Frage enthält eine Liste mit Antworten. Kann mir jemand helfen und mir sagen, wo ich falsch liege?XML-Deserialisierung C# -Array

XML-Datei "pitanja.xml":

<?xml version="1.0" encoding="utf-8"?> 

<Pitanja> 

    <Pitanje> 

    <TekstPitanja> 
     U kojoj državi se nalazi Ajfelova kula? 
    </TekstPitanja> 

    <Odgovori> 
     <Odgovor tacan = "true" > Francuska </Odgovor> 
     <Odgovor> Nemačka </Odgovor> 
     <Odgovor> Španija </Odgovor> 
     <Odgovor> Italija </Odgovor> 
    </Odgovori> 

    </Pitanje> 

    <Pitanje> 

    <TekstPitanja> 
     U kom gradu se nalazi Big Ben? 
    </TekstPitanja> 

    <Odgovori> 
     <Odgovor tacan = "true" > London </Odgovor> 
     <Odgovor> Pariz </Odgovor> 
     <Odgovor> Lisabon </Odgovor> 
     <Odgovor> Madrid </Odgovor> 
    </Odgovori> 

    </Pitanje> 

    <Pitanje> 

    <TekstPitanja> 
     Glavni grad Španije je? 
    </TekstPitanja> 

    <Odgovori> 
     <Odgovor tacan = "true" > Madrid </Odgovor> 
     <Odgovor> Barselona </Odgovor> 
     <Odgovor> Lisabon </Odgovor> 
     <Odgovor> Rim </Odgovor> 
    </Odgovori> 

    </Pitanje> 

</Pitanja> 

C# -Code:

[XmlRoot("Pitanja")] 
public class Pitanja 
{ 
    [XmlArray("Pitanja")] 
    [XmlArrayItem("Pitanje")] 
    public List<Pitanje> SvaPitanja { get; set; } 

} 

public class Pitanje 
{ 
    [XmlElement("TekstPitanja")] 
    public string TekstPitanja { get; set; } // Tekst pitanja 

    [XmlArray("Odgovori")] 
    [XmlArrayItem("Odgovor")] 
    public List<Odgovor> Odgovori { get; set; } // Niz odgovora na pitanje 

} 

public class Odgovor 
{ 
    [XmlText] 
    public string odgovor { get; set; } 

    [XmlAttribute] 
    public Boolean tacan { get; set; } 

} 

public void ucitajpitanja() 
{ 
    XmlSerializer dsr = new XmlSerializer(typeof(Pitanja)); 
    using (System.IO.StreamReader str = new System.IO.StreamReader(@"C:\pitanja.xml")) 
    { 
     pitanja = (Pitanja)dsr.Deserialize(str); 
    } 

} 
+0

Die XmlSerializer sucht (zum Beispiel) ''. Es wird ein '' in ein 'Foo []' Array oder eine 'List ' deserialisieren. Aber ich weiß nicht, wie ich das erreichen könnte, wenn 'ArrayOfFoo'-Elemente in der Quelle fehlen. – phoog

+0

Ich bearbeite ein XML-Dokument, aber das Programm funktioniert immer noch nicht. –

+0

Hallo Zoran, ich vermute, dass Sie die Eigenschaft 'Odgovor.odgoador' mit dem '[XmlText]' - Attribut dekorieren müssen. – phoog

Antwort

1

Ich glaube, Sie brauchen, um die <Odgovor> Elemente in ein zusätzliches Element wickeln - z.B. <Odgovori>

+0

Ich habe bearbeiten XML-Datei & C# -Code, ich füge auch , aber Programm immer noch nicht funktioniert, können Sie mir helfen? –

0

Sowohl das Array als auch das Objekt müssen Deserialisierer haben.

[Serializable] 
public class Pitanje { 
    public Pitanje() { } 

    [XmlAttribute] 
    public Boolean tacan { get; set; } 
} 

[Serializable] 
[XmlRoot("Pitanja", Namespace = "", IsNullable = false)] 
public class PitanjaModelList { 
    [XmlElementAttribute("Pitanje", Form = XmlSchemaForm.Unqualified)] 
    public List<Pitanje> PitanjaList { get; set; } 
} 

Die akzeptierte Antwort hier: Convert XML String to Object werden Sie geben, wie ein perfektes Deserializer für Ihre XML generieren

0

Wenn Sie nicht zu XML-Serialisierung und Ihr Ziel beschränkt werden, ist einfach die XML-Datei in das Objekt zu lesen Als Alternative empfehle ich die Verwendung von Linq zu XML.

Als Probe Ihre XMLfile in Ihren Klassen gelesen werden könnte mit dem folgenden Code:

var result = new Pitanja 
    { 
     SvaPitanja = (from pitanje in System.Xml.Linq.XDocument.Load(@"C:\pitanja.xml").Root.Elements() 
         select new Pitanje 
         { 
          TekstPitanja = pitanje.Element("TekstPitanja").Value.Trim(), 
          Odgovori = (from odgovor in pitanje.Elements("Odgovor") 
             let tacanAttribute = odgovor.Attribute("tacan") 
             select new Odgovor 
             { 
              odgovor = odgovor.Value.Trim(), 
              tacan = tacanAttribute != null && tacanAttribute.Value == "true" 
             }).ToList() 
         }).ToList() 
    }; 
+0

Vielen Dank für Ihre Hilfe, aber ich muss XML-Deserialisierung verwenden, können Sie mir dabei helfen? –