Saya membuat beberapa file xml yang perlu disesuaikan dengan file xsd yang diberikan kepada saya. Apa cara terbaik untuk memverifikasi kepatuhan mereka?
sumber
Saya membuat beberapa file xml yang perlu disesuaikan dengan file xsd yang diberikan kepada saya. Apa cara terbaik untuk memverifikasi kepatuhan mereka?
Pustaka runtime Java mendukung validasi. Terakhir kali saya memeriksa ini adalah parser Apache Xerces di bawah selimut. Anda mungkin harus menggunakan javax.xml.validation.Validator .
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import java.net.URL;
import org.xml.sax.SAXException;
//import java.io.File; // if you use File
import java.io.IOException;
...
URL schemaFile = new URL("http://host:port/filename.xsd");
// webapp example xsd:
// URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd");
// local file example:
// File schemaFile = new File("/location/to/localfile.xsd"); // etc.
Source xmlFile = new StreamSource(new File("web.xml"));
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.validate(xmlFile);
System.out.println(xmlFile.getSystemId() + " is valid");
} catch (SAXException e) {
System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e);
} catch (IOException e) {}
Konstanta pabrik skema adalah string http://www.w3.org/2001/XMLSchema
yang mendefinisikan XSD. Kode di atas memvalidasi deskriptor penyebaran WAR terhadap URL http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
tetapi Anda bisa dengan mudah memvalidasi terhadap file lokal.
Anda tidak boleh menggunakan DOMParser untuk memvalidasi dokumen (kecuali jika tujuan Anda adalah membuat model objek dokumen). Ini akan mulai membuat objek DOM karena mem-parsing dokumen - boros jika Anda tidak akan menggunakannya.
Berikut cara melakukannya menggunakan Xerces2 . Tutorial untuk ini, di sini (daftar persyaratan).
Atribusi asli: disalin secara terang-terangan dari sini :
sumber
Kami membangun proyek kami menggunakan semut, sehingga kami dapat menggunakan tugas schemavalidate untuk memeriksa file konfigurasi kami:
Sekarang file konfigurasi nakal akan gagal membangun kita!
http://ant.apache.org/manual/Tasks/schemavalidate.html
sumber
Karena ini adalah pertanyaan yang populer, saya akan menunjukkan bahwa java juga dapat memvalidasi terhadap xsd "dirujuk", misalnya jika file .xml sendiri menentukan XSD di header, menggunakan
xsi:SchemaLocation
atauxsi:noNamespaceSchemaLocation
(atau xsi untuk ruang nama tertentu) ex :atau SchemaLocation (selalu daftar namespace ke pemetaan xsd)
Jawaban lain juga berfungsi di sini, karena file .xsd "memetakan" ke ruang nama yang dinyatakan dalam file .xml, karena mereka mendeklarasikan namespace, dan jika cocok dengan namespace dalam file .xml, Anda baik. Namun terkadang lebih mudah untuk memiliki penyelesai khusus ...
Dari javadocs: "Jika Anda membuat skema tanpa menentukan URL, file, atau sumber, maka bahasa Java membuat yang terlihat dalam dokumen yang divalidasi untuk menemukan skema yang harus digunakan. Misalnya:"
dan ini berfungsi untuk banyak namespaces, dll. Masalah dengan pendekatan ini adalah bahwa
xmlsns:xsi
itu mungkin lokasi jaringan, jadi secara default akan keluar dan tekan jaringan dengan masing-masing dan setiap validasi, tidak selalu optimal.Berikut ini contoh yang memvalidasi file XML terhadap referensi XSD apa pun (bahkan jika harus menariknya dari jaringan):
Anda dapat menghindari menarik XSD yang dirujuk dari jaringan, meskipun url referensi file xml, dengan menentukan xsd secara manual (lihat beberapa jawaban lain di sini) atau dengan menggunakan pemecah gaya "Katalog XML" . Spring tampaknya juga dapat mencegat permintaan URL untuk melayani file lokal untuk validasi. Atau Anda dapat mengatur sendiri melalui setResourceResolver , mis:
Lihat juga di sini untuk tutorial lainnya.
Saya percaya standarnya adalah dengan menggunakan parsing DOM, Anda dapat melakukan sesuatu yang mirip dengan parser SAX yang memvalidasi juga
saxReader.setEntityResolver(your_resolver_here);
sumber
setResourceResolver
tetapi di luar itu, mungkin membuka pertanyaan baru ...Menggunakan Java 7 Anda dapat mengikuti dokumentasi yang disediakan dalam deskripsi paket .
sumber
parser.parse(new File("instance.xml"))
. Thevalidator
menerimaSource
, sehingga Anda dapat:validator.validate(new StreamSource(new File("instance.xml")))
.ErrorHandler
jika Anda perlu melakukan validasi.Jika Anda memiliki Mesin Linux, Anda dapat menggunakan alat baris perintah SAXCount gratis. Saya menemukan ini sangat berguna.
Ini memvalidasi terhadap dtd dan xsd. 5s untuk file 50MB.
Dalam debian squeeze terletak di paket "libxerces-c-samples".
Definisi dtd dan xsd harus dalam xml! Anda tidak dapat mengonfigurasinya secara terpisah.
sumber
xmllint --schema phone.xsd phone.xml
(dari jawaban oleh 13ren)Satu jawaban lagi: karena Anda mengatakan Anda perlu memvalidasi file yang Anda hasilkan (menulis), Anda mungkin ingin memvalidasi konten saat Anda menulis, alih-alih menulis terlebih dahulu, lalu membaca kembali untuk validasi. Anda mungkin dapat melakukannya dengan JDK API untuk validasi Xml, jika Anda menggunakan penulis berbasis SAX: jika demikian, cukup tautkan dalam validator dengan memanggil 'Validator.validate (sumber, hasil)', di mana sumber berasal dari penulis Anda, dan hasilnya adalah di mana output harus pergi.
Atau jika Anda menggunakan Stax untuk menulis konten (atau perpustakaan yang menggunakan atau dapat menggunakan stax), Woodstox juga dapat langsung mendukung validasi saat menggunakan XMLStreamWriter. Berikut ini entri blog yang menunjukkan bagaimana hal itu dilakukan:
sumber
Jika Anda membuat file XML secara terprogram, Anda mungkin ingin melihat perpustakaan XMLBeans . Menggunakan alat baris perintah, XMLBeans akan secara otomatis menghasilkan dan mengemas satu set objek Java berdasarkan XSD. Anda kemudian dapat menggunakan objek-objek ini untuk membangun dokumen XML berdasarkan skema ini.
Ini memiliki dukungan bawaan untuk validasi skema, dan dapat mengonversi objek Java ke dokumen XML dan sebaliknya.
Castor dan JAXB adalah perpustakaan Java lain yang memiliki tujuan yang mirip dengan XMLBeans.
sumber
Dengan JAXB, Anda dapat menggunakan kode di bawah ini:
sumber
Apakah Anda mencari alat atau perpustakaan?
Sejauh perpustakaan berjalan, standar de-facto cukup banyak adalah Xerces2 yang memiliki kedua versi C ++ dan Java .
Sebelum diperingatkan, itu adalah solusi berat. Tetapi sekali lagi, memvalidasi XML terhadap file XSD adalah masalah berat yang agak berat.
Adapun alat untuk melakukan ini untuk Anda, XMLFox tampaknya menjadi solusi freeware yang layak, tetapi tidak menggunakannya secara pribadi saya tidak bisa mengatakan dengan pasti.
sumber
Validasi terhadap skema online
Validasi terhadap skema lokal
Validasi XML Offline dengan Java
sumber
Menggunakan Woodstox , konfigurasikan pengurai StAX untuk memvalidasi terhadap skema Anda dan parsing XML.
Jika pengecualian tertangkap XML tidak valid, jika tidak maka valid:
Catatan : Jika Anda perlu memvalidasi banyak file, Anda harus mencoba untuk menggunakan kembali
XMLInputFactory
danXMLValidationSchema
untuk memaksimalkan kinerja.sumber
Saya harus memvalidasi XML terhadap XSD hanya satu kali, jadi saya mencoba XMLFox. Saya menemukan itu sangat membingungkan dan aneh. Instruksi bantuan sepertinya tidak cocok dengan antarmuka.
Saya akhirnya menggunakan LiquidXML Studio 2008 (v6) yang jauh lebih mudah digunakan dan lebih akrab (UI sangat mirip dengan Visual Basic 2008 Express, yang sering saya gunakan). Kekurangannya: kemampuan validasi tidak dalam versi gratis, jadi saya harus menggunakan uji coba 30 hari.
sumber