Json-Schema aus XML-Schema (XSD) generieren [geschlossen]

78

Weiß jemand, wie man ein JSON-Schema aus einem vorhandenen XML-Schema (XSD-Datei) generiert ? Gibt es dafür Tools?

JB Hurteaux
quelle
4
Ich denke die eigentliche Frage: "Ist es möglich, eine Zuordnung zwischen JSON-Schema und XML-Schema vorzunehmen?" ist nicht off-topic. Vielleicht könnte die Frage umformuliert werden.
Eric Hartford
1
Falco Nogatz hat 2013 eine BSc-Arbeit gemacht, die zu xsd2json führte .
Supervacuo
Eine Möglichkeit besteht darin, von XSD zu Java-Klassen und von Java-Klassen zu JSON-Schema zu wechseln. Details unter dzone.com/articles/generating-json-schema-xsd .
Koppor

Antworten:

40

Haftungsausschluss : Ich bin der Autor von Jsonix , einer leistungsstarken Open-Source-XML <-> JSON-JavaScript-Zuordnungsbibliothek.

Heute habe ich die neue Version des Jsonix Schema Compilers mit der neuen Funktion zur Generierung von JSON- Schemas veröffentlicht .

Nehmen wir zum Beispiel das Bestellschema . Hier ist ein Fragment:

  <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>

  <xsd:complexType name="PurchaseOrderType">
    <xsd:sequence>
      <xsd:element name="shipTo" type="USAddress"/>
      <xsd:element name="billTo" type="USAddress"/>
      <xsd:element ref="comment" minOccurs="0"/>
      <xsd:element name="items"  type="Items"/>
    </xsd:sequence>
    <xsd:attribute name="orderDate" type="xsd:date"/>
  </xsd:complexType>

Sie können dieses Schema mit dem bereitgestellten Befehlszeilentool kompilieren:

java -jar jsonix-schema-compiler-full.jar
    -generateJsonSchema
    -p PO
    schemas/purchaseorder.xsd

Der Compiler generiert Jsonix-Zuordnungen sowie das passende JSON-Schema .

So sieht das Ergebnis aus (der Kürze halber bearbeitet):

{
    "id":"PurchaseOrder.jsonschema#",
    "definitions":{
        "PurchaseOrderType":{
            "type":"object",
            "title":"PurchaseOrderType",
            "properties":{
                "shipTo":{
                    "title":"shipTo",
                    "allOf":[
                        {
                            "$ref":"#/definitions/USAddress"
                        }
                    ]
                },
                "billTo":{
                    "title":"billTo",
                    "allOf":[
                        {
                            "$ref":"#/definitions/USAddress"
                        }
                    ]
                }, ...
            }
        },
        "USAddress":{ ... }, ...
    },
    "anyOf":[
        {
            "type":"object",
            "properties":{
                "name":{
                    "$ref":"http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema#/definitions/QName"
                },
                "value":{
                    "$ref":"#/definitions/PurchaseOrderType"
                }
            },
            "elementName":{
                "localPart":"purchaseOrder",
                "namespaceURI":""
            }
        }
    ]
}

Dieses JSON-Schema wird nun vom ursprünglichen XML-Schema abgeleitet. Es ist nicht gerade eine 1: 1-Transformation, aber sehr, sehr nahe.

Das generierte JSON-Schema entspricht den generierten Jsonix-Zuordnungen. Wenn Sie also Jsonix für die XML <-> JSON-Konvertierung verwenden, sollten Sie in der Lage sein, JSON mit dem generierten JSON-Schema zu validieren. Es enthält auch alle erforderlichen Metadaten aus dem ursprünglichen XML-Schema (wie Element-, Attribut- und Typnamen).

Haftungsausschluss: Im Moment ist dies eine neue und experimentelle Funktion. Es sind bestimmte Einschränkungen und fehlende Funktionen bekannt . Aber ich erwarte, dass sich dies sehr schnell manifestiert und reift.

Links:

Lexicore
quelle
JsonSchema ist tot. Pläne zur Unterstützung von openAPI?
Lonzak
5
@Lonzak Bisher keine Pläne. Aber schemafolgen Teile auf den ersten Blick der OpenAPI-Spezifikation nicht der JSON-Schema-Spezifikation?
Lexicore
Dies funktioniert beispielsweise nicht mit Java 12
CodeKiller
8

Das JSON-Schema soll nicht dem XML-Schema entsprechen. Es gibt Funktionen in der einen, aber nicht in der anderen.

Im Allgemeinen können Sie eine Zuordnung von XML zu JSON und wieder zurück erstellen. Dies ist jedoch bei XML-Schemas und JSON-Schemas nicht der Fall.

Wenn Sie jedoch eine XML-Datei JSON zugeordnet haben, ist es durchaus möglich, ein JSON-Schema zu erstellen, das diesen JSON fast genauso validiert wie die XSD das XML. Aber es ist keine direkte Zuordnung. Es kann nicht garantiert werden, dass der JSON genau so validiert wird, wie der XSD das XML validiert.

Aus diesem Grund und sofern die beiden Spezifikationen nicht zu 100% funktionskompatibel sind, erfordert die Migration eines Validierungssystems von XML / XSD zu JSON / JSON Schema ein menschliches Eingreifen.

Eric Hartford
quelle
Ich verstehe das nicht Können Sie bitte ein Beispiel geben?
Fenil
3
Angenommen, Sie haben so etwas wie <man name = "Fred"> <dog name = "Rex"> </ dog> </ man> Sie könnten eine Zuordnung definieren, um die Entität in Json darzustellen, zum Beispiel: {"type": "Mann", Name: 'Fred', Haustiere: [{Typ: 'Hund', Name: 'Rex'}]} Es gibt jedoch keine Garantie, dass Sie eine Zuordnung von XSD zu Json Schema erstellen können, die mit derselben Gruppe von übereinstimmt Dokumente
Eric Hartford
6

Haftungsausschluss: Ich bin der Autor von jgeXml.

jgexml verfügt über ein Node.js-basiertes Dienstprogramm, xsd2jsondas eine Transformation zwischen einem XML-Schema (XSD) und einer JSON-Schemadatei durchführt.

Wie bei anderen Optionen handelt es sich nicht um eine 1: 1-Konvertierung, und Sie müssen möglicherweise die Ausgabe manuell bearbeiten, um die Validierung des JSON-Schemas zu verbessern. Sie wurde jedoch verwendet, um ein komplexes XML-Schema in einer OpenAPI-Definition (Swagger) darzustellen.

Ein Beispiel für die in einer anderen Antwort angegebene Datei "purchaseorder.xsd" lautet wie folgt:

"PurchaseOrderType": {
  "type": "object",
  "properties": {
    "shipTo": {
      "$ref": "#/definitions/USAddress"
    },
    "billTo": {
      "$ref": "#/definitions/USAddress"
    },
    "comment": {
      "$ref": "#/definitions/comment"
    },
    "items": {
      "$ref": "#/definitions/Items"
    },
    "orderDate": {
      "type": "string",
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}.*$"
    }
  },
MikeRalphson
quelle
Ich habe es mit installiert npm install -g jgexml. Dann xsd2jsjonwar nicht im Weg. Ich habe es versucht node C:\Users\Oliver\AppData\Roaming\npm\node_modules\jgexml\xsd2json.js. Dies ist jedoch gerade zurückgekehrt. Gibt es ein Befehlszeilenprogramm?
Koppor
Es ist nicht intuitiv benannt, aber es gibt eine Beispiel-CLI intestxsd2j.js
MikeRalphson
Leider funktioniert es nicht und es wird der Fehler TypeError angezeigt: Die Eigenschaft 'AdditionalProperties' kann nicht auf null gesetzt werden. (Zum Beispiel hat Jsonix mit derselben Datei gut funktioniert)
D.Dimitrioglo
Bitte werfen Sie ein Github-Problem auf, wenn Sie die Eingabe teilen können.
MikeRalphson
0

Kopieren Sie Ihr XML-Schema hier und holen Sie sich den JSON-Schemacode in die Online-Tools, die zum Generieren des JSON-Schemas aus dem XML-Schema verfügbar sind.

Karl Parker
quelle
Ich sehe, dass es XSD aus XML generieren kann, aber ich sehe sowieso nicht, ein JSON-Schema zu generieren.
NealWalters
-4

Richtig, aber nachdem Sie json mit xmlspy in xml umgewandelt haben, können Sie die trang-Anwendung (http://www.thaiopensource.com/relaxng/trang.html) verwenden, um eine xsd aus xml-Datei (en) zu erstellen.

Spokk
quelle
8
aber das geht in die falsche Richtung
vipw