none
XML Class Serialize com XmlElement dinamico RRS feed

  • Pergunta

  • Olá pessoal, esgotei minhas fontes de pesquisas, vou postar a pergunta aqui.

     

    Hoje eu tenho o seguinte cenário:

      [XmlRoot("Etiquetas")]
      public class Etiquetas : List<Etiqueta>
      {
    
      }  
    
      public class Etiqueta
      {
        private string _id;
        private string _ptbr;
        private string _enus;
    
        [XmlAttribute]
        public string id
        {
          get { return _id; }
          set { _id = value; }
        }
    
        [XmlElement("pt-br")]
        public string pt_br
        {
          get { return _ptbr; }
          set { _ptbr = value; }
        }
    
        [XmlElement("en-us")]
        public string en_us
        {
          get { return _enus; }
          set { _enus = value; }
        }
    
        public override string ToString()
        {
          return id;
        }
    
      }
    
    

    Quando faço a serialização fica da seguinte forma:

    <Etiquetas xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <Etiqueta id="@1">
      <pt-br>Nome</pt-br> 
      <en-us>Name</en-us> 
     </Etiqueta>
    </Etiquetas>
    

    Porém eu gostaria de poder usar uma coleção para definir a Lingua e o valor referente a tradução da mesma, como no exemplo a seguir:

    public class Etiqueta
      {
        private string _id;    
        private Dictionary<string,string> _linguas = new Dictionary<string,string>();
    
        public string id
        {
          get { return _id; }
          set { _id = value; }
        }
        
        public Dictionary<string, string> Linguas
        {
          get { return _linguas; }
        }
    
        public override string ToString()
        {
          return id;
        }
    
      }
    

    Porém a serialização não funciona, como faço para definir o nome do elemento dinamicamente de acordo com o valor da variavel, para que fique identico ao caso anterior? Ou seja, a chave do dicionário seja o nome do elemento e o valor seja o texto dentro desse elemento.

     

    Agradeço desde já.

    quarta-feira, 20 de outubro de 2010 16:18

Respostas

  • Malange, lamentavelmente não consegui achar nada nesses links, porém consegui fazer eu mesmo a serialização na mão, ficou da seguinte forma:

      public class Etiquetas : List<Etiqueta>, IXmlSerializable
      {
    
        #region IXmlSerializable Members
    
        public XmlSchema GetSchema()
        {
          return new XmlSchema();
        }
    
        public void ReadXml(XmlReader reader)
        {
          while (reader.Read())
          {
            if (reader.Name == "Etiqueta" && reader.NodeType == XmlNodeType.Element)
            {
              Etiqueta etq = new Etiqueta();
              etq.id = reader.GetAttribute("id");          
              while (reader.Read() && reader.Name != "Etiqueta")
              {
                if (reader.ValueType == typeof(string))
                {
                  etq.Linguas.Add(reader.Name, reader.ReadString());
                }
              }
              this.Add(etq);
            }
          }
        }
    
        public void WriteXml(XmlWriter writer)
        {
          writer.WriteStartElement("Etiquetas");
    
          foreach (Etiqueta etq in this)
          {
            writer.WriteStartElement("Etiqueta");
            writer.WriteAttributeString("id", etq.id);
            foreach (var lingua in etq.Linguas)
            {
              writer.WriteStartElement(lingua.Key);
              writer.WriteString(lingua.Value);
              writer.WriteEndElement();
            }
            writer.WriteEndElement();
          }
          writer.WriteEndElement();
    
        }
    
        #endregion
      }
    
      public class Etiqueta
      {
        private string _id;    
        private Dictionary<string,string> _linguas = new Dictionary<string,string>();
    
        [XmlAttribute]
        public string id
        {
          get { return _id; }
          set { _id = value; }
        }
        
        [XmlAnyElement]
        public Dictionary<string, string> Linguas
        {
          get { return _linguas; }
        }
    
        public override string ToString()
        {
          return id;
        }
    
      }
    

    Agradeço a atenção

     

    Abrs

    • Marcado como Resposta Francis Cabral quinta-feira, 21 de outubro de 2010 15:28
    quinta-feira, 21 de outubro de 2010 13:06

Todas as Respostas

  • quarta-feira, 20 de outubro de 2010 21:34
    Moderador
  • Malange, lamentavelmente não consegui achar nada nesses links, porém consegui fazer eu mesmo a serialização na mão, ficou da seguinte forma:

      public class Etiquetas : List<Etiqueta>, IXmlSerializable
      {
    
        #region IXmlSerializable Members
    
        public XmlSchema GetSchema()
        {
          return new XmlSchema();
        }
    
        public void ReadXml(XmlReader reader)
        {
          while (reader.Read())
          {
            if (reader.Name == "Etiqueta" && reader.NodeType == XmlNodeType.Element)
            {
              Etiqueta etq = new Etiqueta();
              etq.id = reader.GetAttribute("id");          
              while (reader.Read() && reader.Name != "Etiqueta")
              {
                if (reader.ValueType == typeof(string))
                {
                  etq.Linguas.Add(reader.Name, reader.ReadString());
                }
              }
              this.Add(etq);
            }
          }
        }
    
        public void WriteXml(XmlWriter writer)
        {
          writer.WriteStartElement("Etiquetas");
    
          foreach (Etiqueta etq in this)
          {
            writer.WriteStartElement("Etiqueta");
            writer.WriteAttributeString("id", etq.id);
            foreach (var lingua in etq.Linguas)
            {
              writer.WriteStartElement(lingua.Key);
              writer.WriteString(lingua.Value);
              writer.WriteEndElement();
            }
            writer.WriteEndElement();
          }
          writer.WriteEndElement();
    
        }
    
        #endregion
      }
    
      public class Etiqueta
      {
        private string _id;    
        private Dictionary<string,string> _linguas = new Dictionary<string,string>();
    
        [XmlAttribute]
        public string id
        {
          get { return _id; }
          set { _id = value; }
        }
        
        [XmlAnyElement]
        public Dictionary<string, string> Linguas
        {
          get { return _linguas; }
        }
    
        public override string ToString()
        {
          return id;
        }
    
      }
    

    Agradeço a atenção

     

    Abrs

    • Marcado como Resposta Francis Cabral quinta-feira, 21 de outubro de 2010 15:28
    quinta-feira, 21 de outubro de 2010 13:06