web-dev-qa-db-fra.com

Générer un schéma Json à partir d'un schéma XML (XSD)

Quelqu'un sait-il comment générer un schéma JSON à partir d'un schéma XML existant (fichier XSD)? Y at-il des outils disponibles pour cela?

69
JB Hurteaux

Disclaimer : Je suis l'auteur de Jsonix , une bibliothèque de mappage XML puissante et open-source <-> JSON JavaScript.

Aujourd'hui, j'ai publié la nouvelle version de Jsonix Schema Compiler , avec la nouvelle fonctionnalité JSON Schema Generation .

Prenons le schéma Commande d'achat par exemple. Voici un 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>

Vous pouvez compiler ce schéma à l'aide de l'outil de ligne de commande fourni:

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

Le compilateur génère mappages Jsonix ainsi que le schéma JSON correspondant .

Voici à quoi ressemble le résultat (édité par souci de concision):

{
    "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":""
            }
        }
    ]
}

Maintenant, ce schéma JSON est dérivé du schéma XML d'origine. Ce n'est pas exactement une transformation 1: 1, mais très très proche.

Le schéma JSON généré correspond aux mappages Jsonix générés. Donc, si vous utilisez la conversion Jsonix pour XML <-> JSON, vous devriez être en mesure de valider JSON avec le schéma JSON généré. Il contient également toutes les métadonnées requises du schéma XML d'origine (comme les noms d'élément, d'attribut et de type).

Disclaimer: Il s'agit pour le moment d'une fonctionnalité nouvelle et expérimentale. Il existe certains connus limitations et fonctionnalités manquantes . Mais je m'attends à ce que cela se manifeste et mûrisse très vite.

Liens:

33
lexicore

Un an après que cette question a été posée à l'origine, JSON Schema reste un projet de document de l'IETF. Au moment de la rédaction de cet article (18 octobre 2011), le groupe de travail tente d'obtenir un accord sur le projet 4 du cahier des charges. Bien qu'il existe quelques implémentations de validation spéculative (voir http://json-schema.org/ ), la plupart des fournisseurs d'outils n'ont pas investi beaucoup d'efforts dans les outils implémentant le développement, l'édition ou la conversion de schémas JSON.

10
J Edward Ellis

Le schéma JSON n'est pas destiné à être équivalent à un schéma XML. Il y a des caractéristiques dans l'une mais pas dans l'autre.

En règle générale, vous pouvez créer un mappage de XML vers JSON, mais ce n'est pas le cas pour les schémas XML et JSON.

Cela dit, si vous avez mappé un fichier XML sur JSON, il est tout à fait possible de créer un schéma JSON qui valide ce JSON de la même manière que XSD valide le XML. Mais ce n'est pas une cartographie directe. Et il n'est pas possible de garantir qu'il validera le JSON exactement de la même façon que le XSD valide le XML.

Pour cette raison, et à moins que les deux spécifications ne soient compatibles à 100% avec les fonctionnalités, la migration d'un système de validation de XML/XSD vers JSON/JSON Schema nécessitera une intervention humaine.

7
Eric Hartford

Disclaimer: Je suis l'auteur de jgeXml.

jgexml a l'utilitaire basé sur Node.js xsd2json qui effectue une transformation entre un schéma XML (XSD) et un fichier de schéma JSON.

Comme pour les autres options, il ne s’agit pas d’une conversion 1: 1 et vous devrez peut-être éditer la sortie manuellement pour améliorer la validation du schéma JSON, mais elle a été utilisée pour représenter un schéma XML complexe dans une définition OpenAPI (swagger).

Un exemple de orderorder.xsd donné dans une autre réponse est présenté comme suit:

"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}.*$"
    }
  },
4
MikeRalphson

Copiez votre schéma XML ici et récupérez le code de schéma JSON dans outils en ligne disponibles pour générer un schéma JSON à partir d'un schéma XML.

0
Karl Parker