Wygeneruj XML z XSD w Visual Studio

Fajną funkcjonalnością Visual Studio Community jest możliwość wygenerowania przykładowego dokumentu XML ze schematu XSD. W tym celu otwieramy plik ze schematem przez standardowe FILE > Open > File lub ikonę Open File na pasku narzędzi (lub naturalnie przez Ctrl+O). Plik otwiera się w trybie projektowania (design) i podpowiada, żeby użyć XML Schema Explorer do obejrzenia schematu. Możemy go uruchomić albo z poziomu podpowiadanego linku, albo przez menu VIEW > XML Schema Explorer (pojawia się w menu tylko jeśli wybrano plik XSD).

GenerateSampleXML

Ponieważ ostatnio na czasie jest temat Jednolitego Pliku Kontrolnego to wygenerujemy plik z tego schematu. Ściągamy przykładowy schemat Magazyn – JK_MAG.xsd i generujemy naciskając na elemencie JPK prawym przyciskiem myszy, po czym wybieramy Generate Sample XML. I mamy błąd.

ErrorSchemaNotResolved

Co zrobić, żeby przykładowy XML dało się wygenerować?

Pierwsze co może przyjść do głowy to droga na skróty – „pewnie coś z uprawnieniami / jakiś problem z odwołaniem do pliku w internecie” – czyli ściągamy wszystkie zależne dokumenty XSD i edytujemy schemat tak, żeby ścieżki wskazywały nie na lokalizację w internecie, tylko na lokalny dysk. Ale damy sobie z tym spokój, bo po pierwsze to wcale nie są przyczyny błędu, a po drugie jeśli pojawi się nowa wersja schematu, to dołożymy sobie pracy przez kolejne edycje plików (a w przypadku JPK musimy wygenerować kilka formatów). Zamiast tego przełączamy się na widok kodu – zwróć uwagę na wybór View Code na pierwszym obrazku po kliknięciu prawym przyciskiem myszy na element schematu. Przewijamy do góry i widzimy podkreślony element <xsd:import>. Po najechaniu myszą pojawia się informacja Request for the permission of type ‚System.Net.WebPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’ failed. To samo zobaczymy w oknie błędów (menu VIEW > Error List).

ErrorRequestForThePermission

Błąd pojawia się, ponieważ plik ze schematem został pobrany z internetu i został zablokowany. Żeby go odblokować przechodzimy do właściwości pliku i wybieramy Odblokuj (w zależności od wersji Windows może to wyglądać inaczej, tutaj przykład dla Windows 10).

UnblockFile

Po wczytaniu pliku ponownie zobaczymy, że zniknęła sekcja Unauthorized zone widoczna na początku przeglądania schematu. Pierwszy sukces. To próbujemy wygenerować ponownie. I znowu błąd Imported schema for namespace (…) was not resolved. To ponownie albo patrzymy do okna błędów, albo najeżdżamy myszą nad podkreślony kod <xsd:import>: Downloads are disabled. You can enable automatic downloads on the Miscellaneous XML Options page under the Text Editor category of the Tools/Options dialog. Czyli wyłączone jest automatyczne pobieranie plików. To włączamy – zgodnie z informacją otwieramy menu TOOLS > Options i przechodzimy do Text Editor > XML > Miscellaneous. Tam zaznaczamy automatyczne pobieranie DTD i schematów.

AutomaticalDownloadOption

Niestety błąd występował nadal, nie pomogło nawet zrestartowanie Visual Studio. Dopiero wybranie opcji View Code w XML Schema Explorer odświeżyło dokument i widok schematu. Zdarzało się też, że ponownie pokazywał się błąd Downloads are disabled. You can enable automatic downloads on the Miscellaneous XML Options page under the Text Editor category of the Tools/Options dialog – choć w opcjach było wszystko zaznaczone poprawnie. Ponowna próba generowania dokumentu w moim przypadku załatwiała sprawę – wszystko się odświeżało i działało.

GenerateSampleXML2

Jeśli wszystko poszło jak trzeba do drzewa dokumentu zaimportowały się pliki zewnętrzne i pokazują się ich przestrzenie nazw i elementy. Teraz można bez problemu wygenerować przykładowy plik.

Reklamy

4 uwagi do wpisu “Wygeneruj XML z XSD w Visual Studio

  1. A czy można poprosić o rozwinięcie tematu o generowanie klasy do c#, za pomocą xsd.exe
    Próbowałem wykonać to polecenie:
    D:\JPK>xsd.exe /c „Schemat_JPK_FA(1)_v1-0.xsd”

    ale dostaje trochę błędów:
    Microsoft (R) Xml Schemas/DataTypes support utility
    [Microsoft (R) .NET Framework, Version 2.0.50727.3038]
    Copyright (C) Microsoft Corporation. All rights reserved.
    Schema validation warning: Typ ‚http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/:TNaturalny’ nie został zadeklarowany lub nie jest type
    position 4.
    Schema validation warning: Typ ‚http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/:TProcentowy’ nie został zadeklarowany. Line 482, posit
    ……
    Warning: Schema could not be validated. Class generation may fail or may produce incorrect results.

    Error: Error generating classes for schema ‚Schemat_JPK_FA(1)_v1-0’.
    – Brak typu danych ‚http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/:TDataCzas’.

    No i w wyniku nie otrzymuje żadnej klasy.

    • Próbowałem generować klasy za pomocą xsd.exe, ale też miałem problemy i sobie odpuściłem.Ale może wrócę do tematu. Pamiętam, że ogólnie miałem problem z xsd.exe, tylko muszę sobie przypomnieć jakie.

    • Podaj w parametrze wszystkie importy (schemy), które są wymagane i wygeneruje bez problemu. W konsoli wpisz xsd.exe /c plik0.xsd plik1.xsd i tak dalej..

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s