/**
   * 将Map对象转换为XML报文字符串
   *
   * @param dataMap
   * @return
   */
  public static String map2DatagramBody(Map<String, Object> dataMap) {
    StringBuffer sb = new StringBuffer();
    Iterator<String> keys = dataMap.keySet().iterator();
    while (keys.hasNext()) {
      String key = keys.next();
      Object value = dataMap.get(key);

      if (CommonValidate.equals(key, "rows")) {
        List<Object> rows = (List<Object>) value;
        sb.append("<ROWS>");
        for (int i = 0; i < rows.size(); i++) {
          Object obj = rows.get(i);
          sb.append("<LIST>");
          sb.append(obj2Xml(obj));
          sb.append("</LIST>");
        }
        sb.append("</ROWS>");
      } else {
        sb.append("<" + key + ">" + value + "</" + key + ">");
      }
    }
    return sb.toString();
  }
  /**
   * 将XML格式报文转换成对象
   *
   * <p>
   * <li>通过java反射对象,根据对象中的每个成员变量,获取对应报文的值
   * <li>然后调用set方法,放入对象
   * <li>如果里面有LIST,则获取LIST其中的内容,递归调用本方法获取对象
   *
   * @param dgXml 待转换xml
   * @param clz 对象Class
   * @return obj对象
   */
  public static Object xml2Obj(String dgXml, Class clz) {
    Object obj = null;
    try {
      // 创建传出的对象
      obj = clz.newInstance();

      // 获取对象的成员变量
      Field[] fields = clz.getDeclaredFields();
      for (Field field : fields) {
        String fieldName = field.getName();
        if (dgXml.indexOf("</" + fieldName + ">") != -1) {

          String value = getDatagramXmlValue(dgXml, fieldName);

          if (CommonValidate.equals(fieldName, "ROWS")) {
            List<Object> list = new ArrayList<Object>();
            if (!CommonValidate.isEmpty(value)) {
              String className = clz.getName();
              className = className + "ROWS";
              do {
                Object valueObj =
                    xml2Obj(
                        value.substring(
                            value.indexOf("<LIST>") + ("<LIST>").length(),
                            value.indexOf("</LIST>")),
                        Class.forName(className));
                list.add(valueObj);
                value = value.substring(value.indexOf("</LIST>") + ("</LIST>").length());
              } while (!CommonValidate.isEmpty(value));
            }
            String methodName = "setROWS";
            // 反射得到方法
            Method m = clz.getDeclaredMethod(methodName, List.class);
            // 通过反射调用set方法
            m.invoke(obj, list);

          } else {
            String methodName = "set" + DataTools.stringUpdateFirst(field.getName());
            // 反射得到方法
            Method m = clz.getDeclaredMethod(methodName, String.class);
            // 通过反射调用set方法
            m.invoke(obj, value);
          }
        }
      }
    } catch (SecurityException e) {
      e.printStackTrace();
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
    return obj;
  }