生成xml字符串笔记
灵魂来源 :https://blog.csdn.net/p812438109/article/details/81807440
自用比较蠢的写法
注意:这里实体类创建尾缀带_baseFlag字段表示标签的名称,其他String字段为标签属性,如果对象中只有String类型字段,则不会有结束标签 如:,如果其中包含对象或List则标签拥有结束标签 如:
一、工具(就是按照规则给排列一下)
public class XmlUtil {
/**
* 作用:
* 1、标识是否需要根节点结束标签
* 2、标签名称尾缀 如: item_baseFlag 表示一个item 标签
*/
public static final String BASE_FLAG = "baseFlag";
/**
* 将对象转换成xml串
* 注意,每个标签需要是对象,该对象中字段尾缀为 baseFlag代表标签名字,其他为标签属性 如: item_baseFlag 表示一个item 标签
* 需要生成标签,则实体类对象中必须存在String类型 规范字段
* 如: private String item_baseFlag;
*
* @param param
* @return
*/
public static String createXmlByModel(Object param) throws ParserConfigurationException, TransformerException {
if (null == param) {
return "";
}
//生成xml
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
document.setXmlStandalone(true);
//第一次遍历获取根节点标签
LinkedHashMap<String, Object> paramMap = JSONObject.parseObject(JSONObject.toJSONString(param), LinkedHashMap.class);
Element itemInfo = null;
for (String key : paramMap.keySet()) {
Object value = paramMap.get(key);
if (null == itemInfo) {
for (String itemKey : paramMap.keySet()) {
String[] itemKeyItemStr = itemKey.split("_");
if (null != itemKeyItemStr && itemKeyItemStr.length >= 2 && BASE_FLAG.equals(itemKeyItemStr[itemKeyItemStr.length - 1])) {
itemInfo = document.createElement(itemKeyItemStr[0]);
}
}
}
if (value instanceof List) {
//循环
for (Object key_valueList : (List) value) {
setRootNode(key_valueList, document, itemInfo);
}
} else {
setRootNode(value, document, itemInfo);
}
}
// 添加根节点
document.appendChild(itemInfo);
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource domSource = new DOMSource(document);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
transformer.transform(domSource, new StreamResult(bos));
return bos.toString();
}
private static void setRootNode(Object param, Document document, Element element) {
LinkedHashMap<String, Object> paramMap = JSONObject.parseObject(JSONObject.toJSONString(param), LinkedHashMap.class);
if (null == paramMap || paramMap.size() <= 0) {
return;
}
/**
* 循环数据
*/
Element itemInfo = null;
for (String key : paramMap.keySet()) {
Object value = paramMap.get(key);
if (null == itemInfo) {
for (String itemKey : paramMap.keySet()) {
String[] itemKeyItemStr = itemKey.split("_");
if (null != itemKeyItemStr && itemKeyItemStr.length >= 2 && BASE_FLAG.equals(itemKeyItemStr[itemKeyItemStr.length - 1])) {
itemInfo = document.createElement(itemKeyItemStr[0]);
}
}
}
if (value instanceof String) {
if (null != value && !"".equals(value)) {
itemInfo.setAttribute(key, (String) value);
}
} else if (value instanceof List) {
//循环
for (Object key_valueList : (List) value) {
setRootNode(key_valueList, document, itemInfo);
}
} else {
setRootNode(value, document, itemInfo);
}
}
//将当前标签放入参数 element 标签下
element.appendChild(itemInfo);
}
}
二、实体类
@Data
public class XmlModel {
private String license_baseFlag;
private Basic licenseModel;
private CatalogModel catalogModel;
/**
* 根节点对象
*/
@Data
public class Basic{
private String surface_baseFlag;
private List<SurfaceModel> surfaceList;
}
@Data
public class CatalogModel{
private String catalog_baseFlag;
private String catalogId;
private String catalogName;
private String templateId;
private String templateName;
private String version;
}
@Data
public class SurfaceModel{
private String item_baseFlag;
private String alias;
private String code;
private String name;
private String require;
private String value;
}
}
三、调用测试
XmlModel xmlModel = new XmlModel();
xmlModel.setLicense_baseFlag("");
XmlModel.Basic basic = new XmlModel().new Basic();
basic.setSurface_baseFlag("");
// basic.setBaseFlag(true);
XmlModel.CatalogModel catalogModel = new XmlModel().new CatalogModel();
catalogModel.setCatalog_baseFlag("");
catalogModel.setCatalogId("dsa45dsad");
catalogModel.setCatalogName("danamename");
catalogModel.setTemplateName("Dasdwr");
catalogModel.setTemplateId("das_id");
xmlModel.setCatalogModel(catalogModel);
ArrayList<XmlModel.SurfaceModel> surfaceModelArrayList = new ArrayList<>();
XmlModel.SurfaceModel surfaceModel = new XmlModel().new SurfaceModel();
surfaceModel.setItem_baseFlag("");
surfaceModel.setAlias("dashjhg");
surfaceModel.setCode("dakjhng");
surfaceModelArrayList.add(surfaceModel);
XmlModel.SurfaceModel surfaceModel2 = new XmlModel().new SurfaceModel();
surfaceModel2.setItem_baseFlag("");
surfaceModel2.setAlias("dasheqwewqe23213jhg");
surfaceModel2.setCode("rferfsrdakjhrng");
surfaceModelArrayList.add(surfaceModel2);
basic.setSurfaceList(surfaceModelArrayList);
xmlModel.setLicenseModel(basic);
String xmlByModel = XmlUtil.createXmlByModel(xmlModel);
System.out.println(xmlByModel);
结果
<?xml version="1.0" encoding="UTF-8"?>
<license>
<catalog catalogId="dsa45dsad" catalogName="danamename" templateId="das_id" templateName="Dasdwr"/>
<surface>
<item alias="dashjhg" code="dakjhng"/>
<item alias="dasheqwewqe23213jhg" code="rferfsrdakjhrng"/>
</surface>
</license>