/**
   * 将对象转换为XML报文字符串
   *
   * <p>
   * <li>通过java反射对象,将对象的每一个成员变量都转换成xml的标签
   * <li>然后将获取每个变量的值,放入标签之间
   *
   * @param obj 待转换对象
   * @return xml字符串
   */
  public static String obj2Xml(Object obj) {
    StringBuffer sb = new StringBuffer();
    try {
      Class clz = obj.getClass();
      Field[] fields = clz.getDeclaredFields();
      for (Field field : fields) {
        String fieldName = field.getName();
        sb.append("<" + fieldName + ">");
        String methodName = "get" + DataTools.stringUpdateFirst(field.getName());
        // 反射得到方法
        Method m = clz.getDeclaredMethod(methodName);
        // 通过反射调用set方法
        sb.append(m.invoke(obj));
        sb.append("</" + fieldName + ">");
      }
    } catch (SecurityException e) {
      e.printStackTrace();
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }

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