2015-08-04 3 views
0

У меня есть эти классы:Omit класс Корневая сериализации

[Serializable] 
    [XmlRoot(ElementName = "allTheQuestions")] 
    public class AllQuestions 
    { 
     [XmlArray("quests")] 
     public List<Question> questions { get; set; } 
    } 

    [Serializable] 
    [XmlType(TypeName="quest")] 
    public class Question 
    { 
     public string enunciado { get; set; } 
     [XmlIgnore] 
     public int CorrectOptionIndex { get; set; } 
     [XmlArray("itens")] 
     public List<Item> options { get; set; } 
    } 


    [Serializable] 
    public class Item 
    { 
     [XmlIgnore] 
     public int correctIndex { get; set; } 
     [XmlIgnore] 
     public int index { get; set; } 

     [XmlAttribute("correct")] 
     public string IsCorrect 
     { 
      get { return correctIndex == index ? "1" : "0"; } 
      set { } // XmlSerializer won't work without a set with a body defined 
     } 

     [XmlAttribute("order")] 
     public string Order 
     { 
      get 
      { 
       char ch = (char) ('a' + index); 

       if (ch > 'z') 
        throw new InvalidOperationException("'ch' canno't be greater than 'z'"); 

       return string.Format("{0})", ch); 
      } 
      set { } // XmlSerializer won't work without a set with a body defined 
     } 

     [XmlText] 
     public string text { get; set; } 
    } 

сериализации с помощью этого:

var list = new List<Item>(); 
list.Add(new Item() { correctIndex = 10, index = 11, text = "asdasd" }); 
list.Add(new Item() { correctIndex = 10, index = 12, text = "asdasaad" }); 
var questions = new List<Question>(); 
questions.Add(new Question { enunciado = "alalal", CorrectOptionIndex = 3, options = list }); 
var all = new AllQuestions { questions = questions }; 

var filename = @"C:\Users\lucas\Desktop\foo.xml"; 
using (var sw = new StreamWriter(filename)) 
     { 
      var emptyNamepsaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty }); 
      var serializer = new XmlSerializer(typeof(AllQuestions)); 
      serializer.Serialize(sw, all, emptyNamepsaces); 
     } 

Сформировать это:

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

<allTheQuestions> 

    <quests> 

    <quest> 

     <enunciado>alalal</enunciado> 

     <itens> 

     <Item correct="0" order="l)">asdasd</Item> 

     <Item correct="0" order="m)">asdasaad</Item> 

     </itens> 

    </quest> 

    </quests> 

</allTheQuestions> 

Как мне удалить <allTheQuestions>?

Оно должно быть:

<quests> 

    <quest> 

     <enunciado>alalal</enunciado> 

     <itens> 

     <Item correct="0" order="l)">asdasd</Item> 

     <Item correct="0" order="m)">asdasaad</Item> 

     </itens> 

    </quest> 

    </quests> 
+0

Ваш желаемый xml также содержит 'allTheQuestions' :) – EZI

+0

извините @EZI, удален! – Jack

+2

Почему бы вам просто не сериализовать 'вопросы'? – EZI

ответ

1

Вместо сериализации AllQuestions, сериализации просто questions

Ваш код сериализации будет похож на это ...

var list = new List<Item>(); 
list.Add(new Item() { correctIndex = 10, index = 11, text = "asdasd" }); 
list.Add(new Item() { correctIndex = 10, index = 12, text = "asdasaad" }); 
var questions = new List<Question>(); 
questions.Add(new Question { enunciado = "alalal", CorrectOptionIndex = 3, options = list }); 

var m = new MemoryStream(); 
using (var sw = new StreamWriter(m)) 
{ 
    var emptyNamepsaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty }); 
    var serializer = new XmlSerializer(questions.GetType(), new XmlRootAttribute("quests")); 
    serializer.Serialize(sw, questions, emptyNamepsaces); 

    var xml = Encoding.UTF8.GetString(m.ToArray()); 
} 

Единственная хитрость заключается в

var serializer = new XmlSerializer(questions.GetType(), new XmlRootAttribute("quests")); 
+0

Спасибо, мне не хватало этой перегрузки конструктора. Могу ли я заставить сериализацию XML сохранять значение целочисленного числа, а не имя? когда я попытался сериализовать свойство типа 'enum X {none = 0, a = 2}' со значением 'X.A', он сохраняет имя' A' (имя перечисления), а не значение '2'? – Jack

+0

Джек, это сайт 'Q & A', а не' Q & A, Q & A, Q & A, ... ' – EZI

+0

вы правы, извините. Я открою еще один. Спасибо за вашу помощь. – Jack

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