有人知道如何从现有的 XML 模式(XSD 文件)生成JSON 模式吗?有没有可用的工具?
5 回答
免责声明:我是Jsonix的作者,这是一个强大的开源 XML<->JSON JavaScript 映射库。
今天我发布了Jsonix Schema Compiler的新版本,具有新的JSON Schema 生成功能。
让我们以采购订单模式为例。这是一个片段:
<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>
您可以使用提供的命令行工具编译此架构:
java -jar jsonix-schema-compiler-full.jar
-generateJsonSchema
-p PO
schemas/purchaseorder.xsd
编译器生成Jsonix 映射以及匹配的 JSON Schema。
这是结果的样子(为简洁而编辑):
{
"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":""
}
}
]
}
现在这个 JSON Schema 是从原始 XML Schema 派生的。这不完全是 1:1 转换,但非常非常接近。
生成的 JSON Schema 匹配生成的 Jsonix 映射。因此,如果您使用 Jsonix 进行 XML<->JSON 转换,您应该能够使用生成的 JSON Schema 验证 JSON。它还包含来自原始 XML 模式的所有必需元数据(如元素、属性和类型名称)。
免责声明:目前这是一个新的实验性功能。存在某些已知限制和缺失的功能。但我希望这会很快显现和成熟。
链接:
- NPM 的演示采购订单项目- 只需签出并
npm install
- 文档
- 当前版本
- npmjs.com 上的 Jsonix 模式编译器
JSON Schema 的功能并不等同于 XML Schema。一个有特点,另一个没有。
通常,您可以创建从 XML 到 JSON 的映射,然后再返回,但 XML 模式和 JSON 模式并非如此。
也就是说,如果您已将 XML 文件映射到 JSON,则很有可能创建一个 JSON 模式来验证该 JSON,其方式与 XSD 验证 XML 的方式几乎相同。但这不是直接映射。并且无法保证它将验证 JSON 与 XSD 验证 XML 完全相同。
出于这个原因,除非这两个规范 100% 兼容,否则将验证系统从 XML/XSD 迁移到 JSON/JSON Schema 将需要人工干预。
免责声明:我是 jgeXml 的作者。
jgexml具有基于 Node.js 的实用程序xsd2json
,可在 XML 模式 (XSD) 和 JSON 模式文件之间进行转换。
与其他选项一样,它不是 1:1 转换,您可能需要手动编辑输出以改进 JSON 模式验证,但它已用于表示 OpenAPI (swagger) 定义中的复杂 XML 模式。
另一个答案中给出的 purchaseorder.xsd 示例呈现为:
"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}.*$"
}
},
在此处复制您的 XML 模式并将 JSON 模式代码获取到可用于从 XML 模式生成 JSON 模式的在线工具。
没错,但是在使用 xmlspy 将 json 转换为 xml 之后,您可以使用 trang 应用程序 (http://www.thaiopensource.com/relaxng/trang.html) 从 xml 文件创建 xsd。