Wie kann XSD schemaLocation projektübergreifend korrekt oder ordnungsgemäß angegeben werden?

8

Sagen wir, ich habe zwei Projekte, A und B. Java-Projekte, falls das wichtig ist.

Projekt A enthält eine Reihe von XSD-Dateien, die Kerntypen und Elemente darstellen. Sie befinden sich alle in einem Paket namens "Definition". Dies wird in project-a.jar eingebaut.

Projekt B stellt ein Erweiterungsprojekt dar, und es ist erlaubt, seine eigenen Typen und Elemente zu definieren. Ich habe ein neues Schema erstellt und es in das Paket "definition.extension" gestellt. Dies wird in project-b.jar eingebaut.

Was genau sollte ich nun für die XSDs in Projekt B als schemaLocation für include angeben?

schemaLocation="../core-types.xsd" hat nicht ganz funktioniert (ich weiß, es ist eine URI erforderlich), aber was genau ist der richtige oder Standardansatz dafür? Google hat mich mehr Leute gefunden, die diese Frage stellen, dass klare, standardisierte Ansätze darüber, was wirklich der richtige Weg ist, damit umzugehen.

Es kann nicht sein, dass ich die schemaLocation während der Laufzeit programmatisch angepasst habe ... oder dass ich einen Build-Schritt / ein Skript benötigen würde, der schemaLocation während der Kompilierung dynamisch ersetzt ... oder?

Ich bin nicht auf der Suche nach Antworten wie "setze sie an einen gemeinsamen Ort". Ich suche nach etwas mehr in Richtung einer Entwicklungsumgebung, die relative Referenzen anstelle von fest codierten Referenzen verwendet.

Zu Ihrer Information: Ich verwende IntelliJ IDEA, falls es einen IDE-spezifischen Ansatz gibt.

    
aberrant80 13.03.2013, 07:13
quelle

2 Antworten

1

Wenn Sie möchten, dass IntelliJ nicht mehr rot anzeigt, können Sie einen benutzerdefinierten URI in Ihrem Include verwenden. Sie gehen dann zu Projekteinstellungen - & gt; Schemas und DTDs, wo Sie diese URI auf eine lokale Datei abbilden können.

Wenn Sie zur Laufzeit eine Schema-Validierung durchführen müssen, ist das eine andere Geschichte. Sie müssen wahrscheinlich einen XML-Katalog verwenden. Wenn Sie JAXB verwenden, sollten Sie sich diese Frage ansehen: jaxb - wie man Xsd-Dateien auf URLs abbildet, um sie zu finden

    
Pieter Herroelen 26.03.2013, 13:47
quelle
0

Sie sollten XML-Kataloge verwenden. Dieser Link gibt eine gründliche Einführung in XML-Kataloge - und wie man sie beispielsweise in Java verwendet - von XML-Experten Norman Walsh. Quote:

  

Diese Katalogdateien können verwendet werden, um öffentliche und System-IDs und andere URIs lokalen Dateien (oder nur anderen URIs) zuzuordnen.

Die oben genannten Bezeichner sind normalerweise schemalocation s oder namespace s, die Sie im Schema import s verwenden.

Wenn Sie solche Kataloge verwenden, um Verwechslungen und einige Fehler in XJC zu vermeiden, empfehle ich Ihnen dringend, diese zu entfernen alle schemaLocation s aus dem Schema importieren in XML-Schemas, und behalten nur namespace (wenn Sie die Wahl haben natürlich). Zum Beispiel:

%Vor%

Geben Sie dann die Zuordnungen für jeden Namespace zum tatsächlichen Schema im Katalog an. Verwenden Sie beispielsweise das OASIS XML-Katalogformat:

%Vor%

Zur Kompilierungszeit, wenn Sie JAXB-annotierte Klassen aus den Schemas generieren, empfehle ich Ihnen, Episoden , um separate Schema-Kompilierung zu aka modulare Schemakompilierung . Dies wird unter anderem von maven-jaxb2-plugin unterstützt, das auch erweiterte Unterstützung für Kataloge .

Zur Laufzeit sollten Sie, abhängig von Ihrem XML-Anwendungsfall, versuchen, eine Bibliothek mit nativer Unterstützung für XML-Kataloge zu verwenden, wie die meisten Java-Webservice-Frameworks (JAX-WS RI / Metro, Apache CXF ...) entwickeln zum Beispiel Web-Services. Wenn Sie das nicht können oder wenn Sie eine bessere Kontrolle über den XML-Katalog haben wollen (zB das Laden von Schemas aus dem Klassenpfad), lade ich Sie ein, sich die Seite XML-Entität und URI-Resolver , die bereits erwähnt wurden, insbesondere die Abschnitte Verwenden von Katalogen mit beliebten Anwendungen und Hinzufügen von Katalogen Unterstützung für Ihre Anwendungen . Grundsätzlich spielen Sie mit org.apache.xml.resolver.tools.CatalogResolver und optional (für feinere Kontrolle) org.apache.xml.resolver.CatalogManager klassen. Für konkrete Beispiele für benutzerdefinierte CatalogResolver / CatalogManager können Sie Code-Quellen von Apache anschauen commons-configuration , AuthzForce , CXF , usw.

    
cdan 23.11.2016 12:17
quelle

Tags und Links