XML与List相互转化
利用XStream类进行转化
以下几个词的意思:
- ConsulServicesServerConfigInfo 为自定义接收对象,存储xml结构的属性
- xmlRoot 根节点名称
- xmlElement 子节点名称
list to xml
/**
* <p>
* List转XML
* </p>
* @param list
* @return
*/
public static String marshall(String xmlRoot, String xmlElement, List<ConsulServicesServerConfigInfo> configs) {
XStream xStream = new XStream(new DomDriver());
xStream.alias(xmlRoot, List.class);
xStream.alias(xmlElement, ConsulServicesServerConfigInfo.class);
if (configs == null) {
configs = Lists.newArrayList();
}
String result = StringUtils.EMPTY;
try {
result = xStream.toXML(configs);
} catch (Exception e) {
logger.warn(e.getMessage());
}
return result;
}
xml to list
/**
* <p>
* XML转List
* </p>
* @param xml
* @return
*/
public static List<ConsulServicesServerConfigInfo> unmarshall(String xmlRoot, String xmlElement, String xml) {
XStream xStream = new XStream(new DomDriver());
xStream.alias(xmlRoot, ConsulServicesServerConfigInfo[].class);
xStream.alias(xmlElement, ConsulServicesServerConfigInfo.class);
ConsulServicesServerConfigInfo[] configs = null;
try {
configs = (ConsulServicesServerConfigInfo[]) xStream.fromXML(xml);
} catch (Exception e) {
logger.warn(e.getMessage());
return null;
}
return Lists.newArrayList(configs);
}
用二分法按长度拆分数组
/**
* 根据传入数组,把数组对应的xml数据按照长度(511kb~512kb)进行拆分
* @param serviceConfigs 配置列表
* @param serviceNodeConsulKey 服务节点在consul的key
* @param serviceNodeType 服务节点类型
* @return Map<String, String> key为服务节点存入consul的key, value是服务节点存入consul的value
* */
public Map<String, String> getServiceConfig(List<ConsulServicesServerConfigInfo> serviceConfigs, String serviceNodeConsulKey, String serviceNodeType) {
int length = serviceConfigs.size();
int fromIndex = 0;
int toIndex = length;
int lastIndex = length;
int firstIndex = 0;
int index = 0;
try {
while (fromIndex < toIndex) {
String serviceConfig = listToXml(Lists.newArrayList(serviceConfigs.subList(fromIndex, toIndex)), serviceNodeType);
int contentLength = serviceConfig.getBytes("utf-8").length;
if (contentLength > CONSUL_CONFIG_LENGTH_RANGE_MAX) {
lastIndex = toIndex;
toIndex = firstIndex + (toIndex - firstIndex) / 2;
} else if (contentLength < CONSUL_CONFIG_LENGTH_RANGE_MIN && toIndex != length) {
firstIndex = toIndex;
toIndex = toIndex + (lastIndex - toIndex) / 2;
} else {
fromIndex = toIndex;
toIndex = length;
firstIndex = fromIndex;
lastIndex = toIndex;
consulConfigMap.put(getConsulReplicaKey(serviceNodeConsulKey, index++), serviceConfig);
}
}
} catch (UnsupportedEncodingException e) {
logger.error("consul config unsupportedEncodingException {}", e.getMessage());
}
return consulConfigMap;
}