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.

Lindelof
źródło
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.

levand
źródło
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

Sam Warwick
źródło
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.

Florian Fankhauser
źródło
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 ...”

yamass
źródło
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


źródło
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

falko
źródło
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.

SCdF
źródło
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);
Michał Rames
źródło
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.

Pat B.
źródło
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).

Cheeso
źródło
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,
5

XML-XIG: Generator instancji XML

http://xml-xig.sourceforge.net/

Ten opensource byłby pomocny.

rolandpeng
źródło
1
Niezbyt przyjazny dla użytkownika. Zgłasza wiele wyjątków, nie może sprawić, że zadziała po niewyjaśnieniu NullPointerException.
Jarekczek
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ę.

Kieveli
źródło
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

Piotr
źródło
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.

otto.poellath
źródło
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

Sprotty
źródło
0

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

Aravind Yarram
źródło
czy możesz zamieścić przykład użycia?
naXa