XML binding для C#
От: iAlexander Россия  
Дата: 12.08.10 13:18
Оценка:
Существуют лм в мире .NET open source утилиты для XML data binding'a?
Т.е. увязывания xml-представления некоторых данных с их представлением в ввиде c sharp класса, автоматическая трансформация данных в из одного представления в другое, и генерация на основе одного представления эквивалентного ему второго.
Пример в Java world такой утилиты — JibX (http://jibx.sourceforge.net/).

В интернете есть почти одинаковые статьи про XML binding в C#:
A closer look at XML Data Binding, including a product appraisal (2004): http://www.codeproject.com/KB/cpp/XML_Data_Binding.aspx
XML Data Binding (2007): http://www.codeguru.com/csharp/.net/net_general/toolsand3rdparty/article.php/c7365__1/XML-Data-Binding.htm

Стандартная xsd.exe от MS позволяет сгенерировать классы, которые после могут быть сериализованы/десериализованы стандартным XmlSerializer'ом: http://support.microsoft.com/kb/301223/ru http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx
Более продвинут http://xsd2code.codeplex.com/ , но он тоже генерирует CS классы из XSD схемы (т.е. генерация только в одну сторону)
Есть еще платная утилита, которая умеет генерировать код и для разбора xml (XML Data Binding Code Generator), и для построения XML — http://www.liquid-technologies.com/
Re: XML binding для C#
От: Aen Sidhe Россия Просто блог
Дата: 12.08.10 13:20
Оценка:
Здравствуйте, iAlexander, Вы писали:

A>Существуют лм в мире .NET open source утилиты для XML data binding'a?


Я наверно туплю. Чем не устраивает стандартный сериализатор?
С уважением, Анатолий Попов.
ICQ: 995-908
Re[2]: XML binding для C#
От: iAlexander Россия  
Дата: 12.08.10 13:50
Оценка:
AS>Я наверно туплю. Чем не устраивает стандартный сериализатор?

Binding — это мостик между двумя представлениями данных, или же окно из C# в мир кроссплатформенного текстового представления. Стандартный сериализатор может лишь сохранить данные так, как ему удобно, а потом восстановить их назад в C# объект. Мостик же этот, когда он существует, позволяет xml данные произвольной структуры (а не только определенной C# сериализатором) переложить на объект с#, если взаимно однозначное соответствие можно установить.
Причем это взаимно однозначное соответствие:
Re[3]: XML binding для C#
От: Aen Sidhe Россия Просто блог
Дата: 12.08.10 13:53
Оценка:
Здравствуйте, iAlexander, Вы писали:

AS>>Я наверно туплю. Чем не устраивает стандартный сериализатор?


A>Binding — это мостик между двумя представлениями данных, или же окно из C# в мир кроссплатформенного текстового представления. Стандартный сериализатор может лишь сохранить данные так, как ему удобно, а потом восстановить их назад в C# объект. Мостик же этот, когда он существует, позволяет xml данные произвольной структуры (а не только определенной C# сериализатором) переложить на объект с#, если взаимно однозначное соответствие можно установить.

A>Причем это взаимно однозначное соответствие:
A>
Там для сериализатора атрибуты управляющие есть, которые всё это умеют. Пример:


public class Item
{
    [XmlAttribute("root")]
    public string Path { get; set; }

    [XmlAttribute]
    public string Assembly { get; set; }
    
    private string m_propertyName;
    
    [XmlAttribute]
    public string PropertyName 
    {
        get 
        { 
            return string.IsNullOrEmpty(m_propertyName)? 
                    Group.NonWordRegex.Replace(System.IO.Path.GetFileNameWithoutExtension(this.Path.Replace("~/", string.Empty)), string.Empty) 
                : m_propertyName; 
        }
        set { m_propertyName = value; }
    }
    
    [XmlIgnore]
    public string ResourceName
    {
        get { return Path.Replace("~/", string.Empty).Replace("/", "."); }
    }
}
С уважением, Анатолий Попов.
ICQ: 995-908
Re[3]: XML binding для C#
От: _FRED_ Черногория
Дата: 12.08.10 15:20
Оценка:
Здравствуйте, iAlexander, Вы писали:

AS>>Я наверно туплю. Чем не устраивает стандартный сериализатор?


A>Binding — это мостик между двумя представлениями данных, или же окно из C# в мир кроссплатформенного текстового представления. Стандартный сериализатор может лишь сохранить данные так, как ему удобно, а потом восстановить их назад в C# объект. Мостик же этот, когда он существует, позволяет xml данные произвольной структуры (а не только определенной C# сериализатором) переложить на объект с#, если взаимно однозначное соответствие можно установить.


Тогда добавим к сериализатору xslt и получим возможность сохранения объектов дотнета в любой xml.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: XML binding для C#
От: iAlexander Россия  
Дата: 12.08.10 19:35
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

AS>Там для сериализатора атрибуты управляющие есть, которые всё это умеют. Пример:



AS>
AS>public class Item
AS>{
AS>    [XmlAttribute("root")]
AS>    public string Path { get; set; }

AS>    [XmlAttribute]
AS>    public string Assembly { get; set; }
    
AS>    private string m_propertyName;
    
AS>    [XmlAttribute]
AS>    public string PropertyName 
AS>    {
AS>        get 
AS>        { 
AS>            return string.IsNullOrEmpty(m_propertyName)? 
AS>                    Group.NonWordRegex.Replace(System.IO.Path.GetFileNameWithoutExtension(this.Path.Replace("~/", string.Empty)), string.Empty) 
AS>                : m_propertyName; 
AS>        }
AS>        set { m_propertyName = value; }
AS>    }
    
AS>    [XmlIgnore]
AS>    public string ResourceName
AS>    {
AS>        get { return Path.Replace("~/", string.Empty).Replace("/", "."); }
AS>    }
AS>}
AS>


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

Однако цели биндинг'а вообще шире простой сериализации/десериализации объектов. Например: по предложенному [фиксированному] входному XML сделать маппинг на уже существующий и лишь частично перекрывающийся с xml по полям класс. Изменять маппинг как конфиг и подсовывать его в рантайме без перезапуска. Валидация xml по xsd схеме перед конструированием объекта.
Re[4]: XML binding для C#
От: iAlexander Россия  
Дата: 12.08.10 19:43
Оценка:
Здравствуйте, _FRED_, Вы писали:

A>>Binding — это мостик между двумя представлениями данных, или же окно из C# в мир кроссплатформенного текстового представления. Стандартный сериализатор может лишь сохранить данные так, как ему удобно, а потом восстановить их назад в C# объект. Мостик же этот, когда он существует, позволяет xml данные произвольной структуры (а не только определенной C# сериализатором) переложить на объект с#, если взаимно однозначное соответствие можно установить.


_FR>Тогда добавим к сериализатору xslt и получим возможность сохранения объектов дотнета в любой xml.


Если взглянуть чисто математически, то да. Задачка решена.
Но с точки зрения инженера-прикладника мы получим немалый overhead на xsl transformation, а бонусом — разработку двух видов трансформаций: прямой и обратной. При этом [скорее всего] построение и разбор xml будут производиться универсальным SAX|DOM|C#-specific парсером.
А класс, созданный JiBX'ом, по скорости разбора рвет всех конкурентов за счет того, что сгенерированный им код предназначен для разбора только того конкретного xml ,на схему которого был натравлен кодогенератор.
Re[5]: XML binding для C#
От: Aen Sidhe Россия Просто блог
Дата: 12.08.10 20:06
Оценка:
Здравствуйте, iAlexander, Вы писали:

A>Здравствуйте, Aen Sidhe, Вы писали:


AS>>Там для сериализатора атрибуты управляющие есть, которые всё это умеют. Пример:


A>Однако цели биндинг'а вообще шире простой сериализации/десериализации объектов. Например: по предложенному [фиксированному] входному XML сделать маппинг на уже существующий и лишь частично перекрывающийся с xml по полям класс. Изменять маппинг как конфиг и подсовывать его в рантайме без перезапуска. Валидация xml по xsd схеме перед конструированием объекта.


Это всё возможно с текущим сериализатором.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[5]: XML binding для C#
От: hardcase Пират http://nemerle.org
Дата: 13.08.10 08:01
Оценка:
Здравствуйте, iAlexander, Вы писали:


A>А класс, созданный JiBX'ом, по скорости разбора рвет всех конкурентов за счет того, что сгенерированный им код предназначен для разбора только того конкретного xml ,на схему которого был натравлен кодогенератор.


XmlSerializer изготавливает и компилирует класс, предназначенный для разбора XML-я совершенно конкретного формата.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: XML binding для C#
От: Aen Sidhe Россия Просто блог
Дата: 13.08.10 08:07
Оценка:
Здравствуйте, iAlexander, Вы писали:

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


A>>>Binding — это мостик между двумя представлениями данных, или же окно из C# в мир кроссплатформенного текстового представления. Стандартный сериализатор может лишь сохранить данные так, как ему удобно, а потом восстановить их назад в C# объект. Мостик же этот, когда он существует, позволяет xml данные произвольной структуры (а не только определенной C# сериализатором) переложить на объект с#, если взаимно однозначное соответствие можно установить.


_FR>>Тогда добавим к сериализатору xslt и получим возможность сохранения объектов дотнета в любой xml.


A>Но с точки зрения инженера-прикладника мы получим немалый overhead на xsl transformation, а бонусом — разработку двух видов трансформаций: прямой и обратной. При этом [скорее всего] построение и разбор xml будут производиться универсальным SAX|DOM|C#-specific парсером.


Нет, не верно. Под каждый класс генерируется специфический парсер, который работает крайне быстро.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[6]: XML binding для C#
От: iAlexander Россия  
Дата: 13.08.10 15:01
Оценка:
Здравствуйте, hardcase, Вы писали:

H>XmlSerializer изготавливает и компилирует класс, предназначенный для разбора XML-я совершенно конкретного формата.


Действительно, http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer%28v=VS.80%29.aspx

Dynamically Generated Assemblies

To increase performance, the XML serialization infrastructure dynamically generates assemblies to serialize and deserialize specified types. The infrastructure finds and reuses those assemblies.


Спасибо, полезная информация
Re[6]: XML binding для C#
От: iAlexander Россия  
Дата: 13.08.10 15:06
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

AS>Нет, не верно. Под каждый класс генерируется специфический парсер, который работает крайне быстро.


Да, убедился, что скорость разбора сериализованного класса обеспечивается уникальным сгенерированным парсером.

Скорость xslt трансформации и необходимость пары схем тоже неверно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.