sobota, 14 stycznia 2012

Tworzenie klasy do deserializacji pliku XML

Español: fotoXML
Image via Wikipedia
Jak zdeserializować plik XML jeżeli nie posiadamy klasy, która została zserializowana.
Do zdeserializowania pliku XML potrzebujemy odpowiedną klasę, która przyjmę dane z pliku.
Za pomocą narzędzia znajdującego się w Windows SDK możemy potrzebne klasy wygenerować. Owym narzędziem rozwiązującym problem jest xsd.exe znajdujący się domyślnie w katalogu:

(Windows 7 x64)
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin

Aby wygenerować potrzebną mam klasę uruchamiamy Visual Studio Command Prompt znajdujący się w:

Start->Wszystkie programy -> Microsoft Visual Studio 2010 -> Visual Studio Tools

Odtworzy się nam okno wiersza poleceń przechodzimy w nim do katalogu z naszym plikiem .xml i wykonujemy następujące czynności:
  • xsd filename.xml – tworzony jest plik XSD dla naszego pliku XML. Jeżeli takowy plik już istnieje pomijamy ten krok.
    • Plik XSD posiada opis schematu pliku XML (jakie pola występują w pliku)
    • Warto przejrzeć wygenerowany plik ponieważ to narzędzie przyjmuje że każda dana jest stringiem, warto zamienić odpowiednie wpisy w pliku na inny typ
    • Typ pola w XSD jest definiowany za pomocą atrybutu type, oprócz xs:string może zawierać następujące typy
      • xs:dateTime
      • xs:time
      • xs:date
      • xs:integer
      • xs: float
      • xs:double
      • resztę typów możliwych do wprowadzenie można znaleźć na stronach W3C
  • xsd filename.xsd /c – tworzone są klasy w języku C# 
    • Można również utworzyć klasę w innym języku korzystając z przełącznika /language.
    • Przykłady:
      • /language:VB – Visual Basic
      • /language:CPP – C++/CLI
  • Zdeserializować przy użyciu klasy XmlSerializer
Enhanced by Zemanta

2 komentarze:

  1. Wszystko fajnie, ale mało elastycznie. Jeśli w pliku zamiast int pojawi się tekst "Niedostępne" - leżymy :) Powyższe podejście wymaga dużego zaufania do autora xml :) To tak bardziej w kontekście xml udostępnianego przez http.

    OdpowiedzUsuń na zawsze
  2. @eM
    Oczywiście to rozwiązanie nie jest genialne i nie wprowadził bym go do kodu produkcyjnego.

    Jednak dla mnie osoby która chciała jednorazowo wrzucić dane do mojego programu, rozwiązanie jest wręcz genialne.

    OdpowiedzUsuń na zawsze