
分享一个 XSD 模式语言解析引擎与多语言代码生成器,希望能够帮助到有需要的朋友。
xgen 是 Go 语言编写的 XSD (XML Schema Definition) 工具基础库,其命令行工具的目标是将 XML 模式定义文件编译为包括 Go/C/Java/Rust/TypeScript 在内的多语言类型或类声明代码。
GitHub 开源: github.com/xuri/xgen
xgen [<flag> ...] <XSD file or directory> ... -i <path> Input file path or directory for the XML schema definition -o <path> Output file path or directory for the generated code -p Specify the package name -l Specify the language of generated code (Go/C/Java/Rust/TypeScript) -h Output this help and exit -v Output version and exit 下面的命令将遍历 xsd 目录中的 XML 模式定义文件,并在 output 目录中生成 Go 语言结构体声明代码:
xgen -i /path/to/your/xsd -o /path/to/your/output -l Go XSD 源文件:
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.org/"> <simpleType name="myType1"> <restriction base="base64Binary"> <length value="10" /> </restriction> </simpleType> <complexType name="myType2"> <simpleContent> <extension base="base64Binary"> <attribute name="length" type="int"/> </extension> </simpleContent> </complexType> <complexType name="myType3"> <simpleContent> <extension base="date"> <attribute name="length" type="int"/> </extension> </simpleContent> </complexType> <complexType name="myType4"> <sequence> <element name="title" type="string"/> <element name="blob" type="base64Binary"/> <element name="timestamp" type="dateTime"/> </sequence> </complexType> <simpleType name="myType5"> <restriction base="gDay"/> </simpleType> </schema> 生成 Go 语言代码:
// Copyright 2020 The xgen Authors. All rights reserved. // // DO NOT EDIT: generated by xgen XSD generator // // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package schema import ( "encoding/xml" "time" ) // MyType1 ... type MyType1 []byte // MyType2 ... type MyType2 struct { XMLName xml.Name `xml:"myType2"` LengthAttr int `xml:"length,attr,omitempty"` } // MyType3 ... type MyType3 struct { XMLName xml.Name `xml:"myType3"` LengthAttr int `xml:"length,attr,omitempty"` } // MyType4 ... type MyType4 struct { XMLName xml.Name `xml:"myType4"` Title string `xml:"title"` Blob []byte `xml:"blob"` Timestamp time.Time `xml:"timestamp"` } // MyType5 ... type MyType5 time.Time