XML десериализация C # массив - PullRequest
3 голосов
/ 27 марта 2012

Я хочу импортировать вопросы для викторины, которые находятся в файле XML.В XML есть список вопросов, и на каждый вопрос есть список ответов.Может кто-нибудь помочь мне и сказать, где я не прав?

XML-файл "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 # код:

[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);
    }

}

Ответы [ 3 ]

1 голос
/ 27 марта 2012

Я думаю, вам нужно обернуть элементы в дополнительный элемент - например,

0 голосов
/ 27 марта 2012

Если вы не ограничены сериализацией XML и ваша цель - просто прочитать XML-файл в вашу объектную модель, то в качестве альтернативы я предлагаю рассмотреть возможность использования Linq to XML.

В качестве примера, ваш XML-файл может быть прочитан в ваши классы с использованием следующего кода:

    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 голосов
/ 27 марта 2012

Массив и объект должны иметь десериализаторы.

[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; }
}

Здесь можно получить ответ: Преобразовать строку XML в объект даст вам способ создать идеальный десериализатор для вашего XML.

...