wake-up-neo.com

was ist die Verwendung von xsi: schemaLocation?

Ich sehe, dass wir wie im Frühling mehrere URLs als Wert dieses Attributs 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? Was ist der Unterschied zwischen xmlns und xsi: schemaLocation?

118
sab

Der Java-XML-Parser, den Spring verwendet, liest die schemaLocation-Werte und versucht, sie aus dem Internet zu laden, um die XML-Datei zu überprüfen. Spring wiederum fängt diese Ladeanforderungen ab und stellt Versionen aus seinen eigenen JAR-Dateien bereit.

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

78
skaffman

Eine xmlns ist ein eindeutiger Bezeichner im Dokument - es muss kein URI für das Schema sein:

XML-Namespaces bieten eine einfache Methode zum Qualifizieren von Element- und Attributnamen, die in Extensible Markup Language-Dokumenten verwendet werden, indem sie mit durch URI-Referenzen identifizierten Namespaces verknüpft werden.

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

kann in einem Dokument verwendet werden, um Hinweise zum physischen Standort von Schemadokumenten zu geben, die für die Bewertung verwendet werden können.

65
Oded

Gemäß der Spezifikation für das Auffinden von Schemata

es kann ein Schema sein, das über den Namensraumnamen abgerufen werden kann oder nicht ... Die Benutzergemeinschaft und/oder Konsumenten-/Anbietervereinbarungen können Bedingungen schaffen, in denen [der Versuch, eine xsd von der Namensraum-URL abzurufen] eine vernünftige Standardstrategie ist

(Danke für die Eindeutigkeit, spec!) 

und 

falls ein Dokumentautor (Mensch oder nicht) ein Dokument mit einem bestimmten Schema erstellt hat und gewährleistet, dass einige oder alle Dokumente mit diesem Schema übereinstimmen, werden schemaLocation und noNamespaceSchemaLocation [Attribute] bereitgestellt.

Wenn Sie also lediglich einen Namespace angeben, wird möglicherweise versucht, Ihre XML-Datei an diesem Ort gegen eine xsd-Datei zu validieren (selbst wenn ihr ein schemaLocation-Attribut fehlt), abhängig von Ihrer "Community". Wenn Sie eine bestimmte schemaLocation angeben, bedeutet dies im Wesentlichen, dass das XML-Dokument dem xsd entsprechen sollte, also "Bitte validieren Sie es" (so wie ich es gelesen habe). Meine Vermutung ist, dass, wenn Sie kein schemaLocation- oder noNamespaceSchemaLocation-Attribut verwenden, es meistens nur "nicht validiert" wird (basierend auf den anderen Antworten erscheint Java auf diese Weise).

Ein weiteres Problem ist, dass in der Regel mit xsd-Validierung in Java-Bibliotheken [ex: spring config xml-Dateien], wenn Ihre XML-Dateien eine bestimmte schemaLocation xsd-URL in einer XML-Datei angeben, wie xsi:schemaLocation="http://somewhere http://somewhere/something.xsd" normalerweise in einem Ihrer abhängigen Jars enthalten eine Kopie der Xsd-Datei in ihrem Ressourcenabschnitt, und Spring verfügt über eine "Zuordnungsfunktion", die besagt, diese Xsd-Datei so zu behandeln, als wäre sie der URL http://somewhere/something.xsd zugeordnet (damit Sie nicht im Web landen und die Datei herunterladen Es existiert nur lokal). Siehe auch https://stackoverflow.com/a/41225329/32453 für weitere Informationen.

19
rogerdpack

Wenn Sie an einen dieser Orte gehen, werden Sie feststellen, was in diesem Schema definiert ist. Beispielsweise erfahren Sie, welchen Datentyp der Wert der ini-method-Schlüsselwörter hat. 

0
Mojun Zhu