Custom Xml Generator

Dzisiaj chciałbym przedstawić Wam kolejną moją bibliotekę, której kod możecie znaleźć na githubie. Do napisania jej natknął mnie ostatnio problem przed którym stanąłem pisząc jedną z aplikacji. Jak zapewne się domyślacie z nazwy posta, będzie to biblioteka mająca związek z XML-em. Otóż standardowy XmlSerializer, dostępny w .NET-cie pozwala nam w bardzo prosty sposób serializować obiekty do XML-a. Niestety serializer ten ma swoje wady, gdyż jako nazwę elementu w XML-u przyjmuje nazwę parametru w klasie. Można to oczywiście zmienić, niestety trzeba to robić za pomocą atrybutów. Mój problem polegał na tym, że dostałem obiekt z WCF’a, więc i klasa leżała po stronie WCF’a, nie mogłem więc dodać sobie dowolnych atrybutów, tak aby nadać nazwy wybranym elementom. Jedynym sposobem jest tworzyć ręcznie całą strukturę XElement. Dlatego postanowiłem stworzyć cos na kształt generatora XML, który bardzo upraszcza tworzenie struktury XML-a. Poniżej przedstawiam sposób działania tej biblioteki.

Załóżmy, ze otrzymujemy z zewnętrznego serwisu obiekt klasy User. Wszystkie potrzebne modele przedstawione są poniżej.

public class User
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public List<Teacher> Teachers { get; set; }
    public SchoolClass Class { get; set; }
}

public class SchoolClass
{
    public string Name { get; set; }
    public Teacher Tutor { get; set; }
}

public class Teacher
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Chcąc wygenerować XML-a musimy nadać nazwy interesującym nas właściwościom. Możemy bindować właściwości na 3 sposoby: jako atrybut, jako element oraz jako kolekcję służą do tego kolejno metody: BindAttribute, BindTag i BindCollection. Wszystkie jako pierwszy parametr pobierają Expression, które wskazuje jaki parametr ma zostać zbindowany, zaś drugi parametr to string oznaczający nazwę elementu bądź atrybutu. Dodatkowo metody BindTag moze przyjąć jako drugi parametr innego XmlBuilder’a, który zajmie się dalszym prasowaniem elementu zaś metoda BindCollection potrzebuje jeszcze trzeciego parametru który albo oznacza nazwę tagu pojedynczego elementu w kolekcji, bądź XmlBuilder’a.

var dbBinder = new XmlBuilder("u"); //1
dbBinder.BindAttribute(e => e.FirstName, "fName");  //2
dbBinder.BindTag(e => e.Age, "a"); //3
dbBinder.BindTag(e => e.Class, classBuilder) //4
dbBinder.BindCollection(e => e.Teachers, "ts", "t"); //5
dbBinder.BindCollection(e => e.Teachers, "ts", teacherBuilder) //6
  1. Tworzymy nasz główny XmlBuilder podając w konstruktorze jako parametr nazwę głównego elementu.
  2. Bindujemy właściwość FirstName jako argument o nazwie fName.
  3. Bindujemy właściwość Age jako oddzielny element o nazwie ‘a’.
  4. Bindujemy właściwość Class jako oddzielny element określony przez innego XmlBuildera.
  5. Bindujemy kolekcję Teachers, gdzie sama kolekcja będzie oznaczona przez tag ‘ts’, a każdy jej element przez tag ‘t’.
  6. Bindujemy kolekcję Teachers, gdzie sama kolekcja będzie oznaczona przez tag ‘ts’, a każdy jej element przez teacherBuildera.

Po wywołaniu metody GenerateXml i przesłaniu w jej parametrze obiektu, z którego chcemy stworzyć XMLa dostajemy XElement, który posiada tylko zbindowane atrybuty i tagi. Umieszczam tą bibliotekę mimo, iż wiem, że można jeszcze sporo do niej dopisać. W najbliższym czasie zamierzam dodać bindowanie kolekcji bez opakowania go w nadrzędny element oraz domyślną serializację do xml’a . Jeśli macie jeszcze jakieś pomysły, co by się przydało możecie pisać lub dopisać samemu i wysłać na github :)

Link do github’a

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *