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 '".
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:
xjc
, dem JAXB-Compiler, zu binden. JAXBContext
und Unmarshaller
Unmarshaller
von unmarshal
. Die Teile des Tutorials, die Sie hier lesen können, sind:
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
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:
Nun definiert XML Schema zwei Arten von Datentypen:
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:
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
.
Beachten Sie bei der Verarbeitung von XmlSchemaParticle
, dass es mehrere Implementierungen haben kann. Siehe: Ссылка
Zu beachten ist, dass Elemente entweder abstrakt oder konkret sein können. Auch hier sind die JavaDocs die beste Anleitung.
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"]'
suchenDanach 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ß.
Sehen Sie sich das an. So analysieren Sie das Schema mithilfe des XOM-Parsers .
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%