Saya memiliki file skema QuickBooks SDK .XSD yang sangat besar yang mendefinisikan permintaan / tanggapan XML yang dapat saya kirim / terima dari QuickBooks.
Saya ingin dapat dengan mudah menghasilkan kelas Java dari file .XSD ini, yang kemudian dapat saya gunakan untuk menyusun XML ke objek Java, dan objek Java ke XML.
Apakah ada cara mudah untuk melakukan ini ...?
Idealnya, itu tidak memerlukan perpustakaan eksternal ke distro Java dasar saat dijalankan. Tapi saya fleksibel ...
Jawaban:
JAXB melakukan apa yang Anda inginkan. Ini dibangun ke dalam JRE / JDK mulai dari 1,6
sumber
Untuk memperluas "gunakan JAXB" komentar di atas,
Di Windows
"%java_home%\bin\xjc" -p [your namespace] [xsd_file].xsd
misalnya,
"%java_home%\bin\xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd
Tunggu sebentar, dan jika Anda memiliki file XSD yang baik, Anda akan mendapatkan beberapa kelas Java yang baik
sumber
Jika Anda ingin mulai mengkode Java ke XML dan XML ke Java dalam waktu kurang dari 5 menit, coba Serialisasi Sederhana XML. Jangan menghabiskan waktu berjam-jam mempelajari JAXB API http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
Namun, jika Anda benar-benar tertarik mempelajari JAXB, berikut ini adalah tutorial yang bagus http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Isi tutorial:
JAXB untuk serialisasi Java-XML sederhana
Ada sejumlah cara untuk melakukan serialisasi XML di Jawa. Jika Anda ingin kontrol halus atas parsing dan serialisasi, Anda bisa menggunakan SAX, DOM, atau Stax untuk kinerja yang lebih baik. Namun, yang sering ingin saya lakukan adalah pemetaan sederhana antara POJO dan XML. Namun, membuat kelas Java untuk melakukan parsing acara XML secara manual bukanlah hal sepele. Baru-baru ini saya menemukan JAXB sebagai pemetaan atau serialisasi Java-XML yang cepat dan nyaman.
JAXB berisi banyak fitur yang bermanfaat, Anda dapat melihat implementasi referensi di sini. Blog Kohsuke juga merupakan sumber yang bagus untuk mempelajari lebih lanjut tentang JAXB. Untuk entri blog ini, saya akan menunjukkan kepada Anda bagaimana melakukan serialisasi Java-XML sederhana dengan JAXB.
POJO ke XML
Katakanlah saya memiliki objek Item Java. Saya ingin membuat serial objek untuk format XML. Apa yang harus saya lakukan pertama adalah untuk membubuhi keterangan POJO ini dengan beberapa penjelasan XML dari javax.xml.bind.annotation. * Paket. Lihat daftar kode 1 untuk Item.java
Dari kode
@XmlRootElement(name="Item")
menunjukkan bahwa saya ingin menjadi elemen root.@XmlType(propOrder = {"name", "price"})
menunjukkan urutan bahwa saya ingin elemen diatur dalam output XML.@XmlAttribute(name="id", ...)
menunjukkan bahwa id adalah atribut untuk elemen root.@XmlElement(....)
menunjukkan bahwa saya ingin harga dan nama menjadi elemen dalam Item.Saya
Item.java
siap Saya kemudian dapat melanjutkan dan membuat skrip JAXB untuk mengatur item.Untuk Daftar Kode lengkap silakan lihat Daftar Kode 2
main.java
. File Daftar Kode output 3item.xml
dibuat. Ini terlihat seperti ini:Mudah bukan? Anda juga dapat menyalurkan output XML sebagai String teks, Stream, Penulis, ContentHandler, dll dengan hanya mengubah parameter metode marshal (...) seperti
XML ke POJO
Mari kita balikkan prosesnya. Asumsikan bahwa saya sekarang memiliki sepotong data string XML dan saya ingin mengubahnya menjadi objek Item.java. Data XML (Daftar kode 3) terlihat seperti
Saya kemudian dapat menghapus kode xml ini ke objek Item oleh
Untuk Daftar Kode lengkap silakan lihat Daftar Kode 2 (main.java). Sumber XML dapat datang dalam berbagai bentuk baik dari Stream dan file. Satu-satunya perbedaan, sekali lagi, adalah parameter metode:
Validasi dengan Skema XML
Hal terakhir yang ingin saya sebutkan di sini adalah memvalidasi input XML dengan skema sebelum membatalkan ke objek Java. Saya membuat file skema XML yang disebut item.xsd. Untuk Daftar Kode lengkap silakan lihat Daftar Kode 4 (Item.xsd). Sekarang yang harus saya lakukan adalah mendaftarkan skema ini untuk validasi.
Ketika saya mencoba untuk menghapus data XML ke POJO, jika input XML tidak sesuai dengan skema, pengecualian akan ditangkap. Untuk Daftar Kode lengkap, lihat Daftar Kode 5 (invalid_item.xml).
Di sini saya mengubah atribut 'id' menjadi string dan bukan bilangan bulat.
Jika input XML valid terhadap skema, data XML tidak akan berhasil untuk objek Item.java berhasil.
sumber
Menggunakan Eclipse IDE: -
sumber
cara termudah adalah menggunakan baris perintah. Cukup ketikkan direktori file .xsd Anda:
Jadi, java akan menghasilkan semua Pojo.
sumber
Maven dapat digunakan untuk tujuan itu, Anda perlu menambahkan beberapa dependensi dan hanya membersihkan aplikasi Anda. Anda akan membuat semua kelas dibuat secara otomatis di folder target Anda.
Cukup salin dari target ke tempat yang diinginkan, berikut ini pom.xml yang telah saya gunakan untuk membuat file dari file xsd:
Cukup tempatkan file xsd Anda di bawah "src / main / webapp / schemas /" dan maven akan menemukannya pada waktu kompilasi.
Semoga ini bisa membantu Anda, informasi lebih lanjut dapat ditemukan di http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.html
Semoga ini akan membantu :)
sumber
No XSD files found. Please check your plugin configuration.
XMLBeans akan melakukannya. Khususnya perintah "scomp".
EDIT: XMLBeans telah dihentikan , periksa posting stackoverflow ini untuk info lebih lanjut.
sumber
Pilihan terbaik adalah
%java_home%\bin\xjc -p [your namespace] [xsd_file].xsd
.Saya juga punya pertanyaan jika kami memiliki opsi untuk melakukan reverse engineering di sini. jika ya dapatkah kita menghasilkan xsd dari kelas pojo?
sumber
Jika Anda tidak keberatan menggunakan perpustakaan eksternal, saya telah menggunakan Castor untuk melakukan ini di masa lalu.
sumber
Batasan JAXB.
Saya bekerja di JAXB, sesuai pendapat saya ini cara yang bagus untuk berurusan dengan data antara objek XML dan Java. Sisi positifnya terbukti dan lebih baik dalam kinerja dan kontrol atas data selama runtime. Dengan penggunaan alat atau skrip yang dibangun dengan baik, ini akan menghilangkan banyak upaya pengkodean.
Saya menemukan bagian konfigurasi bukanlah tugas langsung, dan menghabiskan berjam-jam dalam mendapatkan pengaturan lingkungan pengembangan.
Namun saya menjatuhkan solusi ini karena keterbatasan konyol yang saya hadapi. Definisi Skema XML (XSD) saya memiliki atribut / elemen dengan nama "nilai" dan saya harus menggunakan XSD apa adanya. Kendala yang sangat kecil ini memaksa langkah mengikat saya XJC gagal dengan Kesalahan "Nilai Properti 'sudah digunakan."
Ini karena implementasi JAXB, proses pengikatan mencoba membuat objek Java dari XSD dengan menambahkan beberapa atribut ke setiap kelas dan salah satunya menjadi atribut nilai. Ketika memproses XSD saya, ia mengeluh bahwa sudah ada properti dengan nama itu.
sumber
Bukankah XJC JAXB adalah jawaban yang mungkin untuk ini? Saya berusaha mencapai hal yang sama. Masih dalam fase "mencoba". Datang di XJC, jadi terpikir untuk berbagi.
sumber
Yang terkenal JAXB yang
Ada plugin pakar yang bisa melakukan ini untuk Anda pada tahap membangun yang Anda inginkan.
Anda bisa melakukan hal ini dengan dua cara: xsd <-> Java
sumber
Berbicara tentang batasan JAXB, solusi ketika memiliki nama yang sama untuk atribut yang berbeda adalah menambahkan kustomisasi jaxb inline ke xsd:
+
. . deklarasi yang mengikat. .
atau penyesuaian eksternal ...
Anda dapat melihat informasi lebih lanjut tentang: http://jaxb.java.net/tutorial/section_5_3-Overriding-Names.html
sumber