Имена XML-атрибутов с маленькой буквы при сериализации?
От: Ignoramus  
Дата: 30.01.08 15:02
Оценка:
Существует ли какой-нибудь простой способ (вроде мета-атрибута контролирующего сериализацию), который бы автоматически делал первую букву XML атрибутов маленькой, в отличие от XML-узлов. По умолчанию все property начинаются с большой буквы.

Например:


public class Cls
{
  public Cls() {}

  public string NodeProp
  {
    get{ return m_nodeProp; }
    set{ m_nodeProp = value; }
  }

  [XmlAttribute]
  public string AttrProp
  {
    get{ return m_attrProp; }
    set{ m_attrProp = value; }
  }

  private string m_attrProp;
  private string m_nodeProp;
}


давал бы такой XML:

<Cls attrProp='...'>
<NodeProp>...</NodeProp>
</Cls>
Re: Имена XML-атрибутов с маленькой буквы при сериализации?
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 30.01.08 15:10
Оценка: +2
Здравствуйте, Ignoramus, Вы писали:

I>Существует ли какой-нибудь простой способ (вроде мета-атрибута контролирующего сериализацию), который бы автоматически делал первую букву XML атрибутов маленькой, в отличие от XML-узлов. По умолчанию все property начинаются с большой буквы.


I>Например:



I>
I>public class Cls
I>{
I>  public Cls() {}

I>  public string NodeProp
I>  {
I>    get{ return m_nodeProp; }
I>    set{ m_nodeProp = value; }
I>  }
I>  [XmlAttribute(AttributeName = "attrProp")]
I>  public string AttrProp
I>  {
I>    get{ return m_attrProp; }
I>    set{ m_attrProp = value; }
I>  }

I>  private string m_attrProp;
I>  private string m_nodeProp;
I>}
I>


I>давал бы такой XML:


I><Cls attrProp='...'>

I> <NodeProp>...</NodeProp>
I></Cls>
Re[2]: Имена XML-атрибутов с маленькой буквы при сериализаци
От: Ignoramus  
Дата: 30.01.08 17:19
Оценка:
Здравствуйте, pt4h, Вы писали:

I>> [XmlAttribute(AttributeName = "attrProp")]


Так придется каждый атрибут подписывать. К тому же, если я его переименую, имя в кавычках останется, а хотелось бы чтобы все апдейтилось автоматически.
Re[3]: Имена XML-атрибутов с маленькой буквы при сериализаци
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 30.01.08 20:18
Оценка: +1
Здравствуйте, Ignoramus, Вы писали:

I>Так придется каждый атрибут подписывать. К тому же, если я его переименую, имя в кавычках останется, а хотелось бы чтобы все апдейтилось автоматически.


Переименовать свойство, чтобы оно начиналось с маленькой буквы? Насколько я знаю, сериализатор по дефолту использует имена свойств...
[КУ] оккупировала армия.
Re[4]: Имена XML-атрибутов с маленькой буквы при сериализаци
От: Ignoramus  
Дата: 30.01.08 21:26
Оценка:
Здравствуйте, koandrew, Вы писали:

K>Переименовать свойство, чтобы оно начиналось с маленькой буквы? Насколько я знаю, сериализатор по дефолту использует имена свойств...


Да, но в С# принято называть свойства с большой буквы, а в XML атрибуты с маленькой. Хотя конечно, у каждого своя конвенция...
Re[3]: Имена XML-атрибутов с маленькой буквы при сериализаци
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.01.08 21:29
Оценка: 11 (2)
Здравствуйте, Ignoramus, Вы писали:

I>Так придется каждый атрибут подписывать. К тому же, если я его переименую, имя в кавычках останется, а хотелось бы чтобы все апдейтилось автоматически.


using System;
using System.Xml.Serialization;

namespace XmlAttrs
{
    class Program
    {
        static void Main(string[] args)
        {
            var overrides = new XmlAttributeOverrides();
            var type = typeof(TestClass);
            foreach (var prop in type.GetProperties())
            {
                var attrs = new XmlAttributes();
                var name = prop.Name;
                name = char.ToLower(name[0]) + name.Substring(1);
                attrs.XmlAttribute = new XmlAttributeAttribute(name);
                overrides.Add(type, prop.Name, attrs);
            }

            var tc = new TestClass();
            tc.Attr = "O La La";
            new XmlSerializer(type, overrides).Serialize(Console.Out, tc);

            Console.Read();
        }
    }

    public class TestClass
    {
        public string Attr { get; set; }
    }
}
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[5]: Имена XML-атрибутов с маленькой буквы при сериализаци
От: TK Лес кывт.рф
Дата: 30.01.08 21:36
Оценка: 2 (1)
Здравствуйте, Ignoramus, Вы писали:

K>>Переименовать свойство, чтобы оно начиналось с маленькой буквы? Насколько я знаю, сериализатор по дефолту использует имена свойств...

I>Да, но в С# принято называть свойства с большой буквы, а в XML атрибуты с маленькой. Хотя конечно, у каждого своя конвенция...

Чем-то придется поступиться. Можно написать свой XmlReader/Writer, можно использовать XmlNameAttribute, можно сказать, что классы используеме для Xml сериализации это DTO и используются они только в процессе сериализации
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: Имена XML-атрибутов с маленькой буквы при сериализаци
От: Ignoramus  
Дата: 31.01.08 04:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:

В общем, понятно. Совсем просто не получится, но например так все же можно.

Всем спасибо!

Вау, 3-й C#

AVK>
AVK>using System;
AVK>using System.Xml.Serialization;

AVK>namespace XmlAttrs
AVK>{
AVK>    class Program
AVK>    {
AVK>        static void Main(string[] args)
AVK>        {
AVK>            var overrides = new XmlAttributeOverrides();
AVK>            var type = typeof(TestClass);
AVK>            foreach (var prop in type.GetProperties())
AVK>            {
AVK>                var attrs = new XmlAttributes();
AVK>                var name = prop.Name;
AVK>                name = char.ToLower(name[0]) + name.Substring(1);
AVK>                attrs.XmlAttribute = new XmlAttributeAttribute(name);
AVK>                overrides.Add(type, prop.Name, attrs);
AVK>            }

AVK>            var tc = new TestClass();
AVK>            tc.Attr = "O La La";
AVK>            new XmlSerializer(type, overrides).Serialize(Console.Out, tc);

AVK>            Console.Read();
AVK>        }
AVK>    }

AVK>    public class TestClass
AVK>    {
AVK>        public string Attr { get; set; }
AVK>    }
AVK>}
AVK>
Re[4]: Имена XML-атрибутов с маленькой буквы при сериализаци
От: Аноним  
Дата: 11.07.09 14:23
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Ignoramus, Вы писали:


I>>Так придется каждый атрибут подписывать. К тому же, если я его переименую, имя в кавычках останется, а хотелось бы чтобы все апдейтилось автоматически.


AVK>
AVK>using System;
AVK>using System.Xml.Serialization;

AVK>namespace XmlAttrs
AVK>{
AVK>    class Program
AVK>    {
AVK>        static void Main(string[] args)
AVK>        {
AVK>            var overrides = new XmlAttributeOverrides();
AVK>            var type = typeof(TestClass);
AVK>            foreach (var prop in type.GetProperties())
AVK>            {
AVK>                var attrs = new XmlAttributes();
AVK>                var name = prop.Name;
AVK>                name = char.ToLower(name[0]) + name.Substring(1);
AVK>                attrs.XmlAttribute = new XmlAttributeAttribute(name);
AVK>                overrides.Add(type, prop.Name, attrs);
AVK>            }

AVK>            var tc = new TestClass();
AVK>            tc.Attr = "O La La";
AVK>            new XmlSerializer(type, overrides).Serialize(Console.Out, tc);

AVK>            Console.Read();
AVK>        }
AVK>    }

AVK>    public class TestClass
AVK>    {
AVK>        public string Attr { get; set; }
AVK>    }
AVK>}
AVK>



А как быть в случае если надо изменить имя класса и он не root?
Т.е.
[XmlRootAttribute("mmmm", Namespace = "", IsNullable = false)]
позволяет задать имя для root елемента.
А в свою очередь у него члены.
При этом используется generic и как понимаете напрямую задать имя нельзя :

  [XmlRootAttribute("items", Namespace = "", IsNullable = false)]
  public class ItemCollection<TItem> : ItemCollectionBase<string, TItem> 
  {
    IList<TItem> items;//к примеру
  }
  
  public class Some
  {

  }

  ItemCollection<Some> xxx = new ItemCollection<Some>();

Соответсвенно получим при сериализации
<Some ......>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.