Wie analysiere ich in Java ein XML-Schema (xsd), um zu erfahren, was an einem bestimmten Element gültig ist?

8

Ich möchte in der Lage sein, ein XML-Schema (d. H. Xsd) einzulesen und davon zu wissen, was gültige Attribute, Kindelemente, Werte sind, während ich es durchlaufe.

Nehmen wir zum Beispiel an, dass ich eine xsd habe, gegen die diese XML validiert:

%Vor%

Ich habe mit mehreren Bibliotheken gebastelt und kann sicher <root> als Wurzelelement bekommen. Darüber hinaus bin ich verloren.

Bei einem gegebenen Element muss ich wissen, welche untergeordneten Elemente erforderlich oder zulässig sind, Attribute, Facetten, Auswahlmöglichkeiten usw. Mit dem obigen Beispiel möchte ich wissen, dass element-a ein Attribut type hat und untergeordnete Elemente haben kann element-b und element-c ... oder müssen Kinder haben element-b und element-c ... oder muss eines von beiden haben ... Sie bekommen das Bild, das ich hoffe.

Ich habe mir zahlreiche Bibliotheken wie XSOM, Eclipse XSD und Apache XmlSchema angeschaut und festgestellt, dass sie alle einen guten Beispielcode enthalten. Meine Suche im Internet war ebenfalls erfolglos.

Kennt jemand ein gutes Beispiel oder sogar ein Buch, das zeigt, wie man ein XML-Schema durchläuft und welche gültigen Optionen an einem bestimmten Punkt in einem validierten XML-Dokument gültig sind?

Klärung

Ich möchte kein Dokument validieren, sondern möchte die Optionen an einem bestimmten Punkt kennen, um beim Erstellen oder Bearbeiten eines Dokuments zu helfen. Wenn ich in einem Dokument "Ich bin hier" weiß, würde ich gerne festlegen, was ich an diesem Punkt tun kann. "Fügen Sie eines der Elemente A, B oder C ein" oder "Attribut hinzufügen Beschreibung '".

    
Paul 26.11.2011, 23:59
quelle

6 Antworten

4

Viele der Lösungen zur Validierung von XML in Java verwenden die JAXB-API . Es gibt ein umfangreiches Tutorial hier . Das Grundrezept für das, was Sie mit JAXB suchen, ist wie folgt:

  1. Beschaffen oder erstellen Sie das XML-Schema, für das validiert werden soll.
  2. Generieren Sie Java-Klassen, um die XML-Datei mithilfe von xjc , dem JAXB-Compiler, zu binden.
  3. Schreibe Java-Code zu:
    1. Öffnen Sie den XML-Inhalt als Eingabestream.
    2. Erstellen Sie ein JAXBContext und Unmarshaller
    3. Übergeben Sie den Eingabestream an die Methode Unmarshaller von unmarshal .

Die Teile des Tutorials, die Sie hier lesen können, sind:

  1. Hallo, Welt
  2. Unmarshalling XML
Paul Morie 27.11.2011, 00:35
quelle
1

Ich sehe, dass Sie Eclipse XSD ausprobiert haben. Haben Sie Eclipse Modeling Framework (EMF) ausprobiert? Sie können:

Erstellen eines EMF-Modells mit XML-Schema (XSD)

Erstellen Sie eine dynamische Instanz aus Ihrem Metamodell (3.1 Mit dem Dynamic Instance Creation Tool )

Dies ist zum Erkunden der xsd. Sie können die dynamische Instanz des Wurzelelements erstellen, dann können Sie mit der rechten Maustaste auf das Element klicken und das untergeordnete Element erstellen. Dort sehen Sie, was das mögliche Kinderelement ist und so weiter.

Wie zum Speichern des erstellten EMF-Modells zu einem XML-konforme xsd: Ich muss es nachschlagen. Ich denke, dass Sie JAXB dafür verwenden können ( Wie man EMF benutzt, um XML zu lesen Datei? ).


Einige Referenzen:

EMF: Eclipse Modeling Framework, 2. Ausgabe (geschrieben von YouTubern)
< a href="http://www.vogella.de/articles/EclipseEMF/article.html"> Eclipse Modeling Framework (EMF)
Entdecken Sie das Eclipse Modeling Framework (EMF) und seine dynamischen Funktionen
Erstellen dynamischer EMF-Modelle aus XSDs und Laden ihrer Instanzen aus XML als SDOs

    
user802421 27.11.2011 10:24
quelle
1

Das ist eine gute Frage. Obwohl es alt ist, fand ich keine akzeptable Antwort. Die Sache ist, dass die vorhandenen Bibliotheken, die mir bekannt sind ( XSOM , Apache XmlSchema ) sind als Objektmodelle konzipiert. Die Implementierer hatten nicht die Absicht, Hilfsmethoden bereitzustellen - Sie sollten diese selbst mit dem bereitgestellten Objektmodell implementieren.

Sehen wir uns an, wie die Abfrage kontextspezifischer Elemente mit Apache XmlSchema durchgeführt werden kann.

Sie können ihr Tutorial als Ausgangspunkt verwenden. Darüber hinaus stellt Apache CFX Framework das XmlSchemaUtils Klasse mit vielen praktischen Codebeispielen.

Lesen Sie zuerst XmlSchemaCollection , wie im Tutorial der Bibliothek dargestellt:

%Vor%

Nun definiert XML Schema zwei Arten von Datentypen:

  • Einfache Typen
  • Komplexe Typen

Einfache Typen werden durch die Klasse XmlSchemaSimpleType repräsentiert. Die Handhabung ist einfach. Lesen Sie die Dokumentation: Ссылка . Aber sehen wir uns an, wie man mit komplexen Typen umgeht. Beginnen wir mit einer einfachen Methode:

%Vor%

XmlSchemaComplexType kann sowohl für den realen Typ als auch für das Element extension stehen. Bitte sehen Sie die Methode public static QName getBaseType(XmlSchemaComplexType type) der Klasse XmlSchemaUtils .

%Vor%

Beachten Sie bei der Verarbeitung von XmlSchemaParticle , dass es mehrere Implementierungen haben kann. Siehe: Ссылка

%Vor%

Zu beachten ist, dass Elemente entweder abstrakt oder konkret sein können. Auch hier sind die JavaDocs die beste Anleitung.

    
serhiy.h 25.12.2014 15:23
quelle
0

Es ist ein gutes Stück Arbeit, abhängig davon, wie kompex Ihr xsd ist, aber grundsätzlich.

wenn du

hättest %Vor%

Und Sie wollten herausfinden, wo die erlaubten Kinder des Headers waren (unter Berücksichtigung der Namespaces) Bei Xpath musst du nach '/ element [name="Document"] / element [name="Header"]'

suchen

Danach hängt es davon ab, wie viel Sie tun möchten. Es könnte einfacher sein, etwas zu schreiben oder zu finden, das ein xsd in eine DOM-Typstruktur lädt. Natürlich wirst du möglicherweise alle möglichen Dinge unter diesem Aspekt in xsd finden, Auswahl, Reihenfolge, alle, Attribute, complexType, SimpleContent, Annotation.

Viel zeitaufwendigen Spaß.

    
Tony Hopkinson 27.11.2011 00:43
quelle
0

Dies ist ein recht vollständiges Beispiel für die Syntaxanalyse eines XSD mit XSOM:

%Vor%

Und für Ihren Fehler Reporter verwenden:

%Vor%

Für Ihre Hauptanwendung:

Öffentliche Klasse WDXSOMParser {

%Vor%     
Romain Hippeau 08.05.2016 04:26
quelle

Tags und Links