apa kegunaan xsi: schemaLocation?

131

Saya melihat bahwa kami memiliki beberapa url sebagai nilai atribut ini seperti di musim semi:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

Mengapa itu dibutuhkan dan untuk apa ini digunakan? Apakah Spring membuka url dan memvalidasi? apa perbedaan antara xmlns dan xsi: schemaLocation?

sab
sumber

Jawaban:

87

Java XML parser yang digunakan pegas akan membaca schemaLocationnilai - nilai dan mencoba memuatnya dari internet, untuk memvalidasi file XML. Spring, pada gilirannya, memotong permintaan memuat dan melayani versi dari dalam file JAR sendiri.

Jika Anda menghilangkan schemaLocation, maka parser XML tidak akan tahu ke mana harus mendapatkan skema untuk memvalidasi konfigurasi.

skaffman
sumber
Bukankah parser XML mencari jalur kelas?
HDave
1
@skaffman, Apakah ini berarti bahwa ketika saya menjalankan maven build dari proyek berbasis pegas dengan -o (offline) flag build akan gagal walaupun faktanya semua dependensi tersedia di repositori lokal saya?
aviad
@ HDave Tapi apa yang akan dicari parser XML, skema bisa punya nama
Krzysztof Krasoń
Secara teknis, parser XML pertama-tama akan mencoba memuat skema dari internet, jika tidak ditemukan atau akses internet tidak tersedia, ia akan mencari file * .xsd secara lokal dari jalur kelas, jika masih tidak ditemukan, itu akan dihilangkan.
Frank Zhang
Untuk info lebih lanjut tentang lapisan intersep pegas, lihat stackoverflow.com/a/10768972/32453
rogerdpack
68

An xmlnsadalah pengidentifikasi unik di dalam dokumen - itu tidak harus menjadi URI untuk skema:

Ruang nama XML menyediakan metode sederhana untuk elemen dan nama atribut yang memenuhi syarat yang digunakan dalam dokumen Extensible Markup Language dengan mengaitkannya dengan ruang nama yang diidentifikasi oleh referensi URI.

xsi:schemaLocation seharusnya memberikan petunjuk tentang lokasi skema aktual:

dapat digunakan dalam dokumen untuk memberikan petunjuk tentang lokasi fisik dokumen skema yang dapat digunakan untuk penilaian.

Oded
sumber
22

Menurut spesifikasi untuk menemukan Skema

mungkin ada atau tidak ada skema yang dapat diambil melalui nama namespace ... Komunitas pengguna dan / atau perjanjian konsumen / penyedia dapat menetapkan keadaan di mana [mencoba untuk mengambil xsd dari url namespace] adalah strategi default yang masuk akal

(Terima kasih karena tidak ambigu, spek!)

dan

dalam hal penulis dokumen (manusia atau tidak) membuat dokumen dengan skema tertentu dalam pandangan, dan menjamin bahwa beberapa atau semua dokumen sesuai dengan skema itu, schemaLocation dan noNamespaceSchemaLocation [atribut] disediakan.

Jadi pada dasarnya dengan menetapkan hanya namespace, XML Anda "mungkin" diupayakan divalidasi terhadap xsd di lokasi itu (bahkan jika tidak memiliki schemaLocationatribut), tergantung pada "komunitas" Anda. Jika Anda menentukan spesifik schemaLocation, maka pada dasarnya ini menyiratkan bahwa dokumen xml "harus" sesuai dengan kata xsd, jadi "tolong validasi" (seperti yang saya baca). Dugaan saya adalah bahwa jika Anda tidak melakukan schemaLocationatau noNamespaceSchemaLocationatribut itu hanya "tidak divalidasi" sebagian besar waktu (berdasarkan jawaban lain, tampaknya java melakukannya dengan cara ini).

Kerut lain di sini adalah bahwa biasanya, dengan validasi xsd di pustaka java [mis: spring config xml files], jika file XML Anda menentukan schemaLocationurl xsd tertentu dalam file XML, seperti xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"biasanya dalam salah satu toples ketergantungan Anda, ia akan berisi salinan dari file xsd itu, di bagian sumber dayanya, dan pegas memiliki kemampuan "pemetaan" yang mengatakan untuk memperlakukan file xsd itu seolah-olah memetakan ke url http://somewhere/something.xsd(jadi Anda tidak akan pernah pergi ke web dan mengunduh file, itu hanya ada secara lokal). Lihat juga https://stackoverflow.com/a/41225329/32453 untuk info lebih lanjut.

rogerdpack
sumber
0

Jika Anda pergi ke salah satu lokasi tersebut, maka Anda akan menemukan apa yang didefinisikan dalam skema tersebut. Misalnya, ini memberi tahu Anda apa tipe data dari nilai kata kunci metode-awal ini.

Mojun Zhu
sumber