Jak wygenerować przykładowe dokumenty XML z ich DTD lub XSD?


186

Tworzymy aplikację, która wymaga znacznej liczby transformacji XML. Nie mamy żadnych odpowiednich danych wejściowych testu, same pliki DTD lub XSD. Z tych plików chcielibyśmy sami wygenerować nasze dane testowe. Czy jest na to łatwy / bezpłatny sposób?

Edytować

Najwyraźniej nie ma do tego darmowych narzędzi i zgadzam się, że OxygenXML jest jednym z najlepszych narzędzi do tego.


8
Nie widzę odpowiedzi na te pytania, które nie pasują do formatu pytań i odpowiedzi, lub zabiegamdebate, arguments, polling, or extended discussion
mjn

Odpowiedzi:


29

Myślę, że Oxygen ( http://www.oxygenxml.com/ ) również to robi, ale to kolejny produkt komercyjny. Jest jednak miły ... Gorąco polecam go każdemu, kto wykonuje dużo pracy z XML. Ma też ładną wtyczkę Eclipse.

Wierzę, że jest bezpłatny, w pełni funkcjonalny 30-dniowy okres próbny.


Mam kilka XSD, które z kolei dziedziczą schematy z różnych XSD i muszę wygenerować plik XML do celów testowych z tego XSD, używam do tego OxXXML, ale kiedy próbuję to zrobić, to nie działa dla mnie i mówi, proszę, zdefiniuj węzeł główny, ale nie pozwala mi na to. Więc jeśli ktoś pracował z OxygenXML, sugeruj, co może być w tym celu?
Rachel

Dzięki poziom i. To także odpowiedziało na moje pytanie! Jeśli chciałbyś przyjść odpowiedzieć na moje pytanie: stackoverflow.com/questions/7041388/... , chętnie oznaczę twoje jako odpowiedź.
Eric H

179

W Visual Studio 2008 SP1 i nowszych Eksplorator schematów XML może utworzyć dokument XML z kilkoma podstawowymi przykładowymi danymi:

  1. Otwórz dokument XSD
  2. Przejdź do Eksploratora schematów XML
  3. Kliknij prawym przyciskiem myszy węzeł główny i wybierz „Wygeneruj próbkę Xml”

Zrzut ekranu Eksploratora schematów XML


15
tak, to jest najłatwiejszy sposób. Otwórz XSD, przejdź do XML Schema Explorer, wybierz węzeł główny, kliknij prawym przyciskiem myszy i wybierz „Generuj próbny plik XML”.
balint

+1 Dziękuję @Sam Warwick i @balint. To było naprawdę pomocne!
jessegavin

3
Użyłem tego z VS2008, ale nie mogę tego znaleźć w VS2010. Czy ktoś może potwierdzić, że nadal istnieje?
Simon

Tak samo jak Simon: Nie mogę tego znaleźć w VS2010. Według MSDN powinno nadal tam być, ale po prostu nie pojawi się nigdzie w interfejsie użytkownika: :(
Martijn,

6
@ Simon: „Generuj przykładowy kod XML” jest wyświetlany tylko po kliknięciu prawym przyciskiem myszy jednego z elementów w eksploratorze schematów. Elementy są przedstawione graficznie za pomocą zielonych nawiasów kątowych: „<>”. Prawdopodobnie klikasz typ prawym przyciskiem myszy, a komunikat generowania wygeneruje go tylko dla elementów (co ma sens).
Miguel Sevilla,

126

W najnowszych wersjach darmowego i otwartego źródła Eclipse IDE możesz generować dokumenty XML z plików DTD i XSD. Kliknij prawym przyciskiem myszy dany plik * .dtd lub * .xsd i wybierz „Generuj -> Plik XML ...”. Możesz wybrać, który element główny ma zostać wygenerowany, i czy mają zostać wygenerowane opcjonalne atrybuty i elementy.

Oczywiście możesz używać Eclipse do tworzenia i edytowania plików schematów DTD i XSD. I nie musisz instalować żadnych wtyczek. Jest on zawarty w standardowej dystrybucji.


Dzięki! Eclipse jest bezpłatny, a było to idealne rozwiązanie.
Akku

Czy zdajecie sobie sprawę, która funkcja Eclipse zapewnia tę funkcjonalność? Moje podmenu „Generuj” zawiera „Klasy JAXB” jako jedyny element.
otto.poellath

9
Aby uzyskać te opcje, musisz zainstalować Projekt narzędzi internetowych (patrz Pomoc-> Zainstaluj nowe oprogramowanie).
pwaring

3
Zaćmienie wydaje się dobrą opcją, ale nie mogłem zmusić generacji do śledzenia importowanych plików XSD. Na przykład, gdybym miał XSD opisujący 3 elementy, a jednym z nich był złożony typ zdefiniowany w referencyjnym / importowanym XSD, nie wygenerowałby dla tego elementu. Jakieś pomysły?
David Hergert,

@DavidHergert Prostym obejściem byłoby wygenerowanie typu kodu pośredniczącego.
Adam Matan

32

Dla użytkowników Intellij Idea:

Spójrz na Narzędzia -> Akcje XML

wprowadź opis zdjęcia tutaj

Wydaje się, że działa bardzo dobrze (o ile testowałem).

Edytować:

Jak wspomniano @naXa, możesz teraz także kliknąć prawym przyciskiem myszy plik XSD i kliknąć „Wygeneruj dokument XML ze schematu XSD ...”


czy istnieje sposób na określenie # elementów do wygenerowania (dla sekwencji)?
Nikita

Przetestowałem każde rozwiązanie tego wątku i to działało najlepiej
FLX

1
Nie działa dla mnie w najnowszym RubyMine (wer. 7.0, oparty na Intellij Idea) z XSD z wieloma importami. Mam tylko komunikat o błędzie.
Envek

3
„Błąd kompilacji schematu”?
Czerwony groszek

1
W nowszych wersjach kliknij prawym przyciskiem myszy XSD i wybierz „Generuj dokument XML ze schematu XSD ...”
naXa

12

Kamprocesor dostępny na Sourceforge.net wygeneruje xml przypadek testowy dla dowolnego XSD. Dostępny jest samouczek pokazujący, jak wygenerować własne przykłady testowe - w tym korzystanie ze wskazówek dotyczących treści w celu zapewnienia realistycznych przykładów, a nie tylko przypadkowych śmieci.

Samouczek jest dostępny tutaj: http://www.oasis-open.org/committees/download.php/29661/XSD%20and%20jCAM%20tutorial.pdf

Więcej informacji o narzędziu, które wykorzystuje standard OASIS Content Assembly Mechanism (CAM) do przekształcenia XSD w bardziej przyjazną dla XSLT strukturę, można znaleźć na stronie zasobów - http://www.jcam.org.uk

Ciesz się, DW


3
Bezpośredni link do strony Sourceforge.net do pobrania to: sourceforge.net/projects/camprocessor

@Pyderman - to twoje ustawienia - sprawdź, jak je zmienić.
Ghoti

10

Możesz użyć generatora instancji XML, który jest częścią programu Sun / Oracle Multi-Schema Validator .

To README.txt stwierdza:

Sun XML Generator to narzędzie Java do generowania różnych instancji XML z kilku rodzajów schematów. Obsługuje DTD, przestrzeń nazw RELAX, RELAX Core, TREX oraz podzbiór schematu XML W3C część 1. [...]

Jest to narzędzie wiersza polecenia, które może generować zarówno prawidłowe, jak i niepoprawne wystąpienia ze schematów. Można go używać do generowania przypadków testowych dla aplikacji XML, które muszą być zgodne z określonym schematem.

Pobierz i rozpakuj xmlgen.zipze strony pobierania msv i uruchom następujące polecenie, aby uzyskać szczegółowe instrukcje użytkowania:

java -jar xmlgen.jar -help

Wydaje się, że narzędzie zostało wydane na licencji BSD; kod źródłowy jest dostępny stąd


Bardzo dobrze! Trochę ograniczone. Próbowałem na XSD, który importuje inne XSD i nie powiodło się. Ale na DTD działa bardzo dobrze. Dzięki!
lip

1
Aktualne linki: strona główna , pliki do pobrania . xmlgen.ziptylko w nigthlykatalogu. Potwierdzam brak możliwości wygenerowania próbki z mojego xsd.
Jarekczek

W moim przypadku konieczne było użycie --examplepliku do przechowywania tokenów, których można użyć do wygenerowania nowego pliku przykładowego. Potrzeba próbki, aby zrobić próbkę! Niełatwo ...
Czerwony groszek

Linki java.net są w zasadzie martwe.
RedGrittyBrick

10

XMLSpy robi to za Ciebie, choć nie jest to darmowe ...

Wierzę, że Liquid Xml Studio robi to za Ciebie i jest darmowy, ale osobiście nie użyłem go do tworzenia danych testowych.


Generuje coś, ale nie masz nad tym dużej kontroli: możesz wybrać element najwyższego poziomu i kilka ogólnych opcji, ale nie możesz użyć XMLSpy do wygenerowania zestawu testów z wieloma wariantami itp.
Hans-Peter Störr

XMLSpy wyglądał dobrze, ale wygenerował plik XML, który następnie nie sprawdził poprawności względem pliku xsd użytego do jego wygenerowania. Zawieść. Wpadł też na postiveintegerboisko - *ERROR*zamiast tego wszedł
Tim Abell,

7

Wygląda na to, że jak dotąd nikt nie był w stanie odpowiedzieć na pytanie :)

Używam MOXy EclipseLink do dynamicznego generowania klas powiązań, a następnie rekurencyjnie przechodzę przez powiązane typy. Jest nieco ciężki, ale umożliwia wstrzyknięcie wartości XPath po utworzeniu wystąpienia drzewa obiektów:

InputStream in = new FileInputStream(PATH_TO_XSD);
DynamicJAXBContext jaxbContext = 
            DynamicJAXBContextFactory.createContextFromXSD(in, null, Thread.currentThread().getContextClassLoader(), null);
DynamicType rootType = jaxbContext.getDynamicType(YOUR_ROOT_TYPE);
DynamicEntity root = rootType.newDynamicEntity();
traverseProps(jaxbContext, root, rootType, 0);

TraverseProps jest dość prostą metodą rekurencyjną:

private void traverseProps(DynamicJAXBContext c, DynamicEntity e, DynamicType t, int level) throws DynamicException, InstantiationException, IllegalAccessException{
        if (t!=null) {
            logger.info(indent(level) + "type [" + t.getName() + "] of class [" + t.getClassName() + "] has " + t.getNumberOfProperties() + " props");
            for (String pName:t.getPropertiesNames()){
                Class<?> clazz = t.getPropertyType(pName);
                logger.info(indent(level) + "prop [" + pName + "] in type: " + clazz);
                //logger.info("prop [" + pName + "] in entity: " + e.get(pName));

                if (clazz==null){
                    // need to create an instance of object
                    String updatedClassName = pName.substring(0, 1).toUpperCase() + pName.substring(1);
                    logger.info(indent(level) + "Creating new type instance for " + pName + " using following class name: " + updatedClassName );
                    DynamicType child = c.getDynamicType("generated." + updatedClassName);
                    DynamicEntity childEntity = child.newDynamicEntity();
                    e.set(pName, childEntity);
                    traverseProps(c, childEntity, child, level+1);
                } else {
                    // just set empty value
                    e.set(pName, clazz.newInstance());
                }
            }
        } else {
            logger.warn("type is null");
        }
    }

Konwersja wszystkiego na XML jest dość łatwa:

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);

7

Możesz także użyć XMLPada (darmowy) znajdującego się tutaj http://www.wmhelp.com do wygenerowania próbek xml. Z menu: XSD -> wygeneruj przykładowy plik XML.


Dostaję przepełnienie stosu lub „WMHelp XmlPad przestał działać”, gdy wybieram „Generuj przykładowe dane”
The Red Pea

5

Microsoft opublikował narzędzie „generator dokumentów” jako przykład. W tym artykule opisano szczegółowo architekturę i działanie przykładowej aplikacji.

Jeśli chcesz tylko uruchomić narzędzie do generowania próbek, kliknij tutaj i zainstaluj MSI.

Jest wolne. Źródło jest dostępne. Wymaga .NET Framework do uruchomienia. Działa tylko z XSD. (nie Relax NG ani DTD).


Powyższy link znajduje się w artykule na MSDN zatytułowanym „Generowanie dokumentów XML ze schematów XML”
Sam Warwick,

Instalator upuszcza kilka kodów C # na twój komputer. Po prostu zrzuć je do LinqPad, a otrzymasz darmowy generator instancji XML. Ta dah!
Sean Kearon

9 lat później nadal działa świetnie dla XSD.
Mikanikal,


4

Microsoft Office ma „ InfoPath ”, który pobiera plik XSD jako import i pozwala szybko i łatwo zdefiniować edytor oparty na formularzu do tworzenia plików XML. Ma dwa tryby - jeden, w którym definiujesz formularz, a drugi tryb, w którym tworzysz plik XML poprzez wypełnienie formularza. Wierzę, że po raz pierwszy przyszedł z pakietem Office 2003 i większość ludzi nigdy go nie instaluje. Szokuje mnie, jak bardzo to lubię.


1

XMLBlueprint 7.5 może wykonywać następujące czynności: - generować próbkę xml z dtd - generować próbkę xml ze schematu relaksacyjnego - generować próbkę xml ze schematu xml


1

Wersja SoapUI o otwartym kodzie źródłowym może generować żądania SOAP z WSDL (który zawiera definicje typów XSD), więc wygląda na to, że JEST implementacja tej funkcji typu open source. Niestety nie wiem, do której biblioteki jest przyzwyczajony.


1

Liquid XML Studio ma kreatora XML Sample Generator, który zbuduje przykładowe pliki XML ze schematu XML. Dane wynikowe wydają się być zgodne ze schematem (po prostu nie można wygenerować danych dla wzorców wyrażeń regularnych).

Wygeneruj próbkę XML z XSD


0

OpenXSD biblioteka wspomina, że mają wsparcie dla generowania wystąpień XML w oparciu o XSD. Sprawdź to.


czy możesz zamieścić przykład użycia?
naXa



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.