Java 解析/生成XML结构

321 阅读1分钟

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;
    }