Bagaimana cara menghasilkan sampel dokumen XML dari DTD atau XSD mereka?

186

Kami sedang mengembangkan aplikasi yang melibatkan sejumlah besar transformasi XML. Kami tidak memiliki data uji input yang benar, hanya file DTD atau XSD. Kami ingin membuat data pengujian sendiri dari file-file ini. Apakah ada cara mudah / gratis untuk melakukan itu?

Edit

Tampaknya tidak ada alat gratis untuk ini, dan saya setuju bahwa OxygenXML adalah salah satu alat terbaik untuk ini.

bagian belakang
sumber
8
Saya gagal melihat jawaban untuk pertanyaan ini yang tidak sesuai dengan format Tanya Jawab, atau memintadebate, arguments, polling, or extended discussion
mjn

Jawaban:

29

Saya pikir Oxygen ( http://www.oxygenxml.com/ ) melakukannya juga, tapi itu produk komersial lain. Itu bagus, meskipun ... Saya sangat merekomendasikannya untuk siapa pun yang melakukan banyak pekerjaan XML. Muncul dalam plugin Eclipse yang bagus juga.

Saya percaya ada uji coba 30 hari yang berfitur lengkap dan gratis.

levand
sumber
Saya memiliki banyak XSD yang pada gilirannya mewarisi skema dari XSD yang berbeda dan saya perlu membuat file XML untuk tujuan pengujian dari XSD ini, saya menggunakan oxygenXML untuk melakukan ini tetapi ketika saya mencoba melakukannya, itu tidak bekerja untuk saya dan katanya tolong tentukan simpul root tapi daripada itu tidak memungkinkan saya untuk melakukannya. Jadi, jika ada yang pernah bekerja dengan oxygenXML menyarankan apa yang bisa menjadi jalan keluar untuk ini?
Rachel
Terima kasih leveland. Ini menjawab pertanyaan saya juga! Jika Anda ingin menjawab pertanyaan saya: stackoverflow.com/questions/7041388/… , saya akan dengan senang hati menandai pertanyaan Anda sebagai jawabannya.
Eric H
179

Dalam Visual Studio 2008 SP1 dan kemudian XML Schema Explorer dapat membuat dokumen XML dengan beberapa data sampel dasar:

  1. Buka dokumen XSD Anda
  2. Beralih ke Explorer Skema XML
  3. Klik kanan simpul root dan pilih "Hasilkan Sampel Xml"

Cuplikan layar Explorer Skema XML

Sam Warwick
sumber
15
ya, ini cara termudah. Buka XSD, beralih ke XML Schema Explorer, pilih simpul root, klik kanan dan pilih "Hasilkan Sampel Xml".
balint
+1 Terima kasih @Sam Warwick dan @balint. Ini sangat membantu!
jessegavin
3
Saya menggunakan ini dengan VS2008, tetapi saya tidak dapat menemukan ini di VS2010. Adakah yang bisa mengkonfirmasi bahwa ini masih ada?
Simon
Sama seperti Simon: Saya juga tidak dapat menemukan ini di VS2010. Menurut MSDN, itu harus tetap ada, tetapi tidak akan muncul di mana pun di UI ... :-(
Martijn
6
@Simon: Anda hanya mendapatkan "Hasilkan Sampel XML" ketika Anda mengklik kanan salah satu elemen dalam skema penjelajah. Elemen digambarkan secara grafis melalui kurung sudut kiri / kanan hijau: "<>". Anda mungkin mengklik kanan suatu jenis, dan pesan yang dihasilkan hanya akan menghasilkannya untuk elemen (yang masuk akal).
Miguel Sevilla
126

Dalam versi terbaru dari Eclipse IDE sumber bebas dan terbuka, Anda dapat membuat dokumen XML dari file DTD dan XSD. Klik kanan pada file * .dtd atau * .xsd yang diberikan dan pilih "Hasilkan -> File XML ...". Anda dapat memilih elemen root mana yang akan dihasilkan dan apakah atribut dan elemen opsional harus dihasilkan.

Tentu saja Anda dapat menggunakan Eclipse untuk membuat dan mengedit file skema DTD dan XSD Anda juga. Dan Anda tidak perlu menginstal plugin apa pun. Itu termasuk dalam distribusi standar.

Florian Fankhauser
sumber
Terima kasih! Eclipse gratis, dan ini adalah solusi sempurna.
Akku
Apakah kalian tahu fitur Eclipse apa yang menyediakan fungsionalitas ini? Submenu "Hasilkan" saya memiliki "Kelas JAXB" sebagai satu-satunya item.
otto.poellath
9
Anda perlu menginstal Proyek Alat Web (lihat di Bantuan-> Instal Perangkat Lunak Baru) untuk mendapatkan opsi ini.
pwaring
3
Eclipse sepertinya pilihan yang bagus, tapi saya tidak bisa mendapatkan generasi untuk mengikuti XSD yang diimpor. Misalnya, jika saya memiliki XSD yang menjelaskan 3 elemen, dan salah satunya adalah tipe kompleks yang didefinisikan dalam XSD yang direferensikan / diimpor, itu tidak akan menghasilkan untuk elemen itu. Ada ide?
David Hergert
@ Davidvidergar Solusi sederhana akan menghasilkan tipe rintisan.
Adam Matan
32

Untuk pengguna Intellij Idea:

Lihat Alat -> Tindakan XML

masukkan deskripsi gambar di sini

Tampaknya bekerja dengan sangat baik (sejauh yang saya uji).

Edit:

Seperti yang disebutkan oleh @naXa, Anda sekarang juga dapat mengklik kanan pada file XSD dan klik "Hasilkan Dokumen XML dari Skema XSD ..."

yamass
sumber
apakah ada cara untuk menentukan # elemen yang akan dihasilkan (untuk urutan)?
Nikita
Saya menguji setiap solusi dari utas ini dan ini berhasil
FLX
1
Tidak berfungsi untuk saya di RubyMine terbaru (v. 7.0, berbasis Intellij Idea) dengan XSD dengan banyak impor. Saya mendapat pesan kesalahan.
Envek
3
"Kesalahan Kompilasi Skema"?
The Red Pea
1
Dalam versi yang lebih baru, klik kanan pada XSD dan pilih "Hasilkan Dokumen XML dari Skema XSD ..."
naXa
12

Camprocessor yang tersedia di Sourceforge.net akan melakukan pembuatan case test xml untuk setiap XSD. Ada tutorial yang tersedia untuk menunjukkan kepada Anda cara membuat contoh pengujian Anda sendiri - termasuk menggunakan petunjuk konten untuk memastikan contoh yang realistis, bukan hanya yang sampah acak.

Tutorial ini tersedia di sini: http://www.oasis-open.org/committees/download.php/29661/XSD%20and%20jCAM%20tutorial.pdf

Dan informasi lebih lanjut tentang alat ini - yang menggunakan standar OASIS Content Assembly Mechanism (CAM) untuk memperbaiki XSD Anda menjadi struktur yang lebih ramah XSLT - dapat ditemukan dari situs web sumber daya - http://www.jcam.org.uk

Selamat menikmati, DW


sumber
3
Tautan langsung ke unduhan Sourceforge.net adalah: sourceforge.net/projects/camprocessor
@Pyderman - itulah pengaturan Anda - cari cara mengubahnya.
Ghoti
10

Anda dapat menggunakan XML Instance Generator yang merupakan bagian dari Validator Sun / Oracle Multi-Schema .

Status README.txt:

Sun XML Generator adalah alat Java untuk menghasilkan berbagai instance XML dari beberapa jenis skema. Ini mendukung DTD, RELAX Namespace, RELAX Core, TREX, dan subset dari W3C XML Schema Part 1. [...]

Ini adalah alat baris perintah yang dapat menghasilkan instance yang valid dan tidak valid dari skema. Ini dapat digunakan untuk menghasilkan kasus uji untuk aplikasi XML yang perlu menyesuaikan dengan skema tertentu.

Unduh dan buka paket xmlgen.zipdari halaman unduh msv dan jalankan perintah berikut untuk mendapatkan instruksi penggunaan terperinci:

java -jar xmlgen.jar -help

Alat ini tampaknya dirilis di bawah lisensi BSD; kode sumber dapat diakses dari sini

falko
sumber
Sangat bagus! Tapi agak terbatas. Saya mencobanya pada XSD yang mengimpor XSD lain dan gagal. Tetapi pada DTD itu bekerja dengan sangat baik. Terima kasih!
lindelof
1
Tautan saat ini: beranda , unduhan . xmlgen.ziphanya di nigthlydirektori. Saya mengkonfirmasi ketidakmampuan untuk menghasilkan sampel dari xsd saya.
Jarekczek
Dalam kasus saya, perlu menggunakan --examplefile untuk memuat token yang dapat digunakan untuk menghasilkan file sampel baru. Dibutuhkan sampel untuk membuat sampel! Tidak mudah ...
The Red Pea
Tautan java.net pada dasarnya mati.
RedGrittyBrick
10

XMLSpy melakukan itu untuk Anda, meskipun itu tidak gratis ...

Saya percaya bahwa Liquid Xml Studio melakukannya untuk Anda dan gratis, tetapi saya belum menggunakannya secara pribadi untuk membuat data uji.

SCdF
sumber
Ini menghasilkan sesuatu, tetapi Anda tidak memiliki banyak kontrol atasnya: Anda dapat memilih elemen tingkat atas dan beberapa opsi umum, tetapi Anda tidak dapat menggunakan XMLSpy untuk menghasilkan set testcases dengan banyak varian dll.
Hans-Peter Störr
XMLSpy terlihat bagus tetapi menghasilkan xml yang kemudian gagal memvalidasi terhadap xsd yang digunakan untuk menghasilkannya. Gagal. Itu juga muntah di postiveintegerlapangan - menempatkan *ERROR*sebagai gantinya
Tim Abell
7

Sepertinya tidak ada yang bisa menjawab pertanyaan sejauh ini :)

Saya menggunakan MOXy EclipseLink untuk secara dinamis menghasilkan kelas yang mengikat dan kemudian secara rekursif melalui jenis terikat. Ini agak berat, tetapi memungkinkan injeksi nilai XPath setelah pohon objek instantiated:

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 adalah metode rekursif yang cukup sederhana:

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");
        }
    }

Mengubah segalanya menjadi XML cukup mudah:

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

Anda juga dapat menggunakan XMLPad (gratis untuk digunakan) yang ditemukan di sini http://www.wmhelp.com untuk menghasilkan sampel xml Anda. Dari menu: XSD -> hasilkan file XML sampel.

Pat B
sumber
Saya mendapatkan stack overflow atau "WMHelp XmlPad telah berhenti bekerja" ketika saya memilih "Hasilkan Sampel Data"
The Red Pea
5

Microsoft telah menerbitkan alat "generator dokumen" sebagai sampel. Ini adalah artikel yang menjelaskan arsitektur dan operasi aplikasi sampel secara terperinci.

Jika Anda hanya ingin menjalankan alat pembuatan sampel, klik di sini dan instal MSI.

Gratis. Sumber tersedia. Membutuhkan .NET Framework untuk dijalankan. Hanya bekerja dengan XSD. (bukan Relax NG atau DTD).

Cheeso
sumber
Tautan di atas adalah ke artikel di MSDN yang disebut 'Menghasilkan Dokumen XML dari XML Schemas'
Sam Warwick
Penginstal menjatuhkan banyak kode C # ke mesin Anda. Hanya membuangnya ke LinqPad dan Anda memiliki generator instance XML gratis Anda. Ta dah!
Sean Kearon
9 tahun kemudian, ini masih bekerja dengan baik untuk XSD.
Mikanikal
5

XML-XIG: Generator XML Instance

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

Sumber terbuka ini akan sangat membantu.

rolandpeng
sumber
1
Tidak ramah pengguna. Melempar banyak pengecualian, tidak bisa membuatnya bekerja setelah tidak dijelaskan NullPointerException.
Jarekczek
4

Microsoft Office memiliki ' InfoPath ', yang mengambil XSD sebagai impor dan memungkinkan Anda dengan cepat dan mudah mendefinisikan editor berbasis formulir untuk membuat file XML. Ini memiliki dua mode - satu di mana Anda mendefinisikan formulir, dan mode lain di mana Anda membuat file XML dengan mengisi formulir. Saya percaya ini pertama kali datang dengan Office 2003, dan kebanyakan orang tidak pernah menginstalnya. Saya terkejut melihat betapa saya menyukainya.

Kieveli
sumber
1

XMLBlueprint 7.5 dapat melakukan hal berikut: - menghasilkan sampel xml dari dtd - menghasilkan sampel xml dari skema santai ng - menghasilkan sampel xml dari skema xml

Peter
sumber
1

Versi open source dari SoapUI dapat menghasilkan permintaan SOAP dari WSDL (yang berisi definisi tipe XSD), jadi sepertinya ada implementasi open source dari fungsi ini. Sayangnya, saya belum menemukan perpustakaan mana yang digunakan untuk ini.

otto.poellath
sumber
1

Liquid XML Studio memiliki wizard Pembuatan Sampel XML yang akan membuat sampel file XML dari Skema XML. Data yang dihasilkan tampaknya sesuai dengan skema (tidak bisa menghasilkan data untuk pola regex).

Hasilkan Sampel XML dari XSD

Bintik-bintik
sumber
0

The OpenXSD perpustakaan menyebutkan bahwa mereka memiliki dukungan untuk menghasilkan contoh XML berdasarkan XSD. Lihat itu.

Aravind Yarram
sumber
dapatkah Anda memposting contoh penggunaan?
naXa