java生成XSD(xml)文档
工具类
public class xsdUtils{
/**
* 生成XSD并下载
* @param root 表头名称
* @param archivesList 插入数据
* @param path 下载路径
*/
public static void xsdAdd(String root, ContractArchivesVo archivesList, String path){
try {
// 初始化一个XML解析工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建一个DocumentBuilder实例
DocumentBuilder builder = factory.newDocumentBuilder();
// 创建一个Document实例
Document doc = builder.newDocument();
// standalone用来标识改文件是否呼叫其他外部的文件,"yes"表示没有呼叫外部文件
doc.setXmlStandalone(true);
String schema = "http://www.w3.org/2001/XMLSchema";
Element schemaElement = doc.createElement("xs:schema");
schemaElement.setAttribute("name","mySchema");
schemaElement.setAttribute("xmlns:xs",schema);
Element rootElement = doc.createElement("xs:element");
rootElement.setAttribute("name",root);
schemaElement.appendChild(rootElement);
Element complexType = doc.createElement("xs:complexType");
rootElement.appendChild(complexType);
Element sequence = doc.createElement("xs:sequence");
complexType.appendChild(sequence);
// 拿到属性值
Field[] field = ContractArchivesVo.class.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
if(field[i].isAnnotationPresent(ChkParam.class)) {
// 注释拿到属性中文解释
ChkParam annotation = field[i].getAnnotation(ChkParam.class);
// 反射拿到属性类型
Class<?> type = field[i].getType();
char[] cs=type.getName().toCharArray();
cs[0]-=32;
// 尾结点新增
Element element = doc.createElement("xs:element");
element.setAttribute("name",annotation.name());
element.setAttribute("type","xs:string");
Object getMethod = getGetMethod(archivesList, field[i].getName());
String textContent = ObjectUtils.toString(getMethod, "");
element.setTextContent(textContent);
sequence.appendChild(element);
}
}
doc.appendChild(schemaElement);
//这里是固定格式
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();//作用,将xml文档转换为其他格式
transformer.setOutputProperty("encoding", "UTF-8");
transformer.transform(new DOMSource(doc), new StreamResult(new File(path)));
}catch (Exception e){
log.error("转换失败:"+e.getMessage());
}
}
/**
* 根据属性,获取get方法
* @param ob 对象
* @param name 属性名
* @return
* @throws Exception
*/
public static Object getGetMethod(Object ob , String name)throws Exception{
Method[] m = ob.getClass().getMethods();
for(int i = 0;i < m.length;i++){
if(("get"+name).toLowerCase().equals(m[i].getName().toLowerCase())){
return m[i].invoke(ob);
}
}
return null;
}
}
实体类
@Data
public class ContractArchivesVo {
/** id */
private Long id;
/** 名称*/
@ChkParam(name = "名称")
private String name;
/** 性别 */
@ChkParam(name = "性别")
private String sex;
/** 邮箱 */
private String email;
}
ChkParam
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ChkParam {
/**
* 检查参数属性名称
* @return
*/
public String name() default "";
/**
* 参数类型
* @return
*/
public String type() default "";
/**
* 备用字段
* @return
*/
public String dac() default "";
}
运行
public static void main(String[] args) {
ContractArchivesVo archivesVo = new ContractArchivesVo();
archivesVo.setName("法外狂徒");
xsdAdd.xsdAdd("测试",archivesVo,"C:\Users\data\text.xml")
}
返回
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" name="mySchema">
<xs:element name="测试">
<xs:complexType>
<xs:sequence>
<xs:element name="名称" type="xs:string">法外狂徒</xs:element>
<xs:element name="性别" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>