Was ist die Verwendung von xsi: schemaLocation?

131

Ich sehe, dass wir wie im Frühjahr mehrere URLs als Wert für dieses Attribut haben:

<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">

Warum wird es benötigt und wofür wird es verwendet? Geht Spring zur URL und validiert sie? Was ist der Unterschied zwischen xmlns und xsi: schemaLocation?

sab
quelle

Antworten:

87

Der von Spring verwendete Java-XML-Parser liest die schemaLocationWerte und versucht, sie aus dem Internet zu laden, um die XML-Datei zu validieren. Spring fängt wiederum diese Ladeanforderungen ab und stellt Versionen aus seinen eigenen JAR-Dateien bereit.

Wenn Sie das weglassen schemaLocation, weiß der XML-Parser nicht, wo er das Schema abrufen kann, um die Konfiguration zu überprüfen.

Skaffman
quelle
Würde der XML-Parser nicht den Klassenpfad durchsuchen?
HDave
1
@skaffman, Bedeutet dies, dass beim Ausführen eines Maven-Builds eines frühlingsbasierten Projekts mit dem Flag -o (offline) der Build fehlschlägt, obwohl alle Abhängigkeiten in meinem lokalen Repository verfügbar sind?
Aviad
@ HDave Aber was würde XML-Parser suchen, Schema könnte einen beliebigen Namen haben
Krzysztof Krasoń
Technisch gesehen versucht der XML-Parser zunächst, das Schema aus dem Internet zu laden. Wenn es nicht gefunden wird oder kein Internetzugang verfügbar ist, durchsucht er die * .xsd-Datei lokal aus dem Klassenpfad. Wenn sie immer noch nicht gefunden wird, wird sie weggelassen.
Frank Zhang
Weitere Informationen zur Spring Intercept Layer finden Sie unter stackoverflow.com/a/10768972/32453
rogerdpack
68

An xmlnsist eine eindeutige Kennung innerhalb des Dokuments - es muss kein URI für das Schema sein:

XML-Namespaces bieten eine einfache Methode zum Qualifizieren von Element- und Attributnamen, die in Dokumenten der Extensible Markup Language verwendet werden, indem sie Namespaces zugeordnet werden, die durch URI-Referenzen identifiziert werden.

xsi:schemaLocation soll einen Hinweis auf den tatsächlichen Speicherort des Schemas geben:

kann in einem Dokument verwendet werden, um Hinweise zum physischen Speicherort von Schemadokumenten zu geben, die zur Bewertung verwendet werden können.

Oded
quelle
22

Gemäß der Spezifikation zum Auffinden von Schemata

Möglicherweise kann ein Schema über den Namespace-Namen abgerufen werden oder nicht ... Benutzergemeinschafts- und / oder Verbraucher- / Anbietervereinbarungen können Umstände festlegen, unter denen [der Versuch, eine xsd aus der Namespace-URL abzurufen] eine sinnvolle Standardstrategie ist

(Danke, dass du eindeutig bist, spec!)

und

Falls ein Dokumentautor (menschlich oder nicht) ein Dokument mit einem bestimmten Schema erstellt hat und sicherstellt, dass ein Teil oder das gesamte Dokument diesem Schema entspricht, werden die Attribute schemaLocation und noNamespaceSchemaLocation [angegeben] bereitgestellt.

Wenn Sie also nur einen Namespace angeben, wird möglicherweise versucht, Ihr XML anhand einer xsd an diesem Speicherort zu validieren (auch wenn ihm ein schemaLocationAttribut fehlt ), abhängig von Ihrer "Community". Wenn Sie ein bestimmtes angeben schemaLocation, bedeutet dies im Grunde, dass das XML-Dokument "konform" mit dem xsd sein sollte. "Bitte validieren Sie es" (während ich es lese). Ich vermute, wenn Sie ein schemaLocationoder ein noNamespaceSchemaLocationAttribut nicht ausführen, wird es die meiste Zeit nur "nicht validiert" (basierend auf den anderen Antworten scheint Java dies so zu tun ).

Ein weiterer Falte hier ist , dass typischerweise mit XSD - Validierung in Java - Bibliotheken [ex: spring Config XML - Dateien], wenn die XML - Dateien an einer bestimmte schemaLocationXSD - URL in einer XML - Datei, wie xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"normalerweise in einem Ihrer Abhängigkeit Gläser werden es enthält eine Kopie Diese XSD-Datei in ihrem Ressourcenbereich und Spring verfügt über eine "Zuordnungs" -Funktion, die besagt, dass diese XSD-Datei so behandelt wird, als ob sie der URL zugeordnet wäre http://somewhere/something.xsd(sodass Sie nie ins Internet gehen und die Datei herunterladen müssen, sie existiert nur lokal). Weitere Informationen finden Sie unter https://stackoverflow.com/a/41225329/32453 .

Rogerdpack
quelle
0

Wenn Sie an einen dieser Speicherorte gehen, finden Sie, was in diesem Schema definiert ist. Beispielsweise erfahren Sie, welchen Datentyp der Schlüsselwortwert der ini-Methode hat.

Mojun Zhu
quelle