`

Java XML解析,,Node直接转为对象。考虑了一般的类,简单类型,数组,还未考虑List,Map

 
阅读更多
XML解析类
 package com.supermap.services.components.tilecache.convert;
 
 import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.w3c.dom.Text;
 
 public class XMLUtil {
 
     /**
      * 得到第一个非文本的节点
      * 
      * @param node
      * @return
      */
     public static Node getFirstNode(Node node) {
         NodeList nodelist = node.getChildNodes();
         for (int i = 0; i < nodelist.getLength(); i++) {
             Node childNode = nodelist.item(i);
             if (childNode instanceof Text) {
                 continue;
             }
             return childNode;
         }
         return null;
     }
 
     /**
      * 得到节点下Tag为name的节点
      * 
      * @param node
      * @param name
      * @return
      */
     public static Node getNodeByTagName(Node node, String name) {
         Element elem = (Element) node;
         return elem.getElementsByTagName(name).item(0);
     }
 
     /**
      * 得到节点下Tag为name的节点集合
      * 
      * @param node
      * @param name
      * @return 节点集合
      */
     public static List<Node> getNodesByTagName(Node node, String name) {
         Element elem = (Element) node;
         NodeList nodelist = elem.getElementsByTagName(name);
         List<Node> result = new ArrayList<Node>();
         for (int i = 0; i < nodelist.getLength(); i++) {
             result.add(nodelist.item(i));
         }
         return result;
     }
 
     /**
      * 判断节点是否为文本节点 <a>string</a> 就是文本节点
      * 
      * @param node
      * @return
      */
     public static Boolean isTextNode(Node node) {
         NodeList childs = node.getChildNodes();
         if (childs.getLength() == 1) {
             Node child = childs.item(0);
             if (child instanceof Text) {
                 return true;
             }
         }
         return false;
     }
 
     /**
      * 节点非文本节点的集合
      * 
      * @return
      */
     public static List<Node> getChildsNodes(Node node) {
         NodeList nodelist = node.getChildNodes();
         List<Node> result = new ArrayList<Node>();
         for (int i = 0; i < nodelist.getLength(); i++) {
             Node child = nodelist.item(i);
             if (child instanceof Text) {
                 continue;
             }
             result.add(child);            
         }
         return result;
     }
 
     @SuppressWarnings("unchecked")
     /**
      * 把node转成type类型的对象
      * @param node
      * @param type
      * @return
      */
     public static <T> T nodeToObject(Node node, Class<?> type) {
         Object obj = null;
         if (type.isArray()) {// 考虑数组
             Class<?> itemType = type.getComponentType();//级数元素类型
             List<Node> childs = getChildsNodes(node);
             Object array= Array.newInstance(itemType, childs.size());
             for(int i =0;i<childs.size();i++){
                 Node childNode = childs.get(i);
                 Object childValue = nodeToObject(childNode,itemType);
                 Array.set(array, i, childValue);
             }
             return (T) array;            
         }
         if(type.isPrimitive()){//如果是简单类型
             return (T) ReflectionUtil.getValue(type, node.getTextContent());
         }
         //list类型
         try {
             obj = type.newInstance();//一般意义的类了
         } catch (Exception e) {
             e.printStackTrace();
             return (T) obj;
         }
         NodeList childs = node.getChildNodes();
         for (int i = 0; i < childs.getLength(); i++) {
             Node child = childs.item(i);
             if (child instanceof Text) {
                 continue;
             }
             String nodeName = child.getNodeName();
             try {
                 if (isTextNode(child)) {// 如果是文本类的
                     ReflectionUtil.setPropertyValue(obj, nodeName,
                             child.getTextContent());
                 } else {
                     Class<?> propType = ReflectionUtil.getPropertyType(obj,
                             nodeName);
                     if (propType != null) {
                         Object childValue = nodeToObject(child, propType);
                         ReflectionUtil.setPropertyValue(obj, nodeName,
                                 childValue);
                     }
                 }
             } catch (Exception ex) {
                 ex.printStackTrace();
             }
 
         }
         return (T) obj;
     }
 
 }


==============================================

反射类
 package com.supermap.services.components.tilecache.convert;
 
 import java.beans.BeanInfo;
 import java.beans.IntrospectionException;
 import java.beans.Introspector;
 import java.beans.PropertyDescriptor;
 import java.lang.reflect.InvocationTargetException;
 
 import com.supermap.services.components.commontypes.OutputFormat;
 
 
 public class ReflectionUtil {
     
     /**
      * 给属性赋值[默认包括了字段]
      * @param obj
      * @param proName
      * @param value
      * @throws IntrospectionException 
      * @throws InvocationTargetException 
      * @throws IllegalAccessException 
      * @throws IllegalArgumentException 
      */
     public static void setPropertyValue(Object obj,String proName,Object value) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
          BeanInfo beanInfo= Introspector.getBeanInfo(obj.getClass());
          for(PropertyDescriptor prop : beanInfo.getPropertyDescriptors()){
              if(prop.getName().equals(proName)){
                  Class<?> propType =prop.getReadMethod().getReturnType();
                  Object porpvalue = getValue(propType, value);
                  prop.getWriteMethod().invoke(obj, porpvalue);
                  return ;
              }
          }
          
          for(java.lang.reflect.Field field : obj.getClass().getFields()){
              if( field.getName().equals(proName)){
                  Object filedValue= getValue(field.getType(),value);    
                  field.set(obj, filedValue);            
                  return ;
              }
          }
     }
     
     /**
      * 得到属性的类别
      * @param obj
      * @param proName
      * @return 
      * @throws IntrospectionException 
      */
     public static Class<?> getPropertyType(Object obj,String proName) throws IntrospectionException{
          BeanInfo beanInfo= Introspector.getBeanInfo(obj.getClass());
          for(PropertyDescriptor prop : beanInfo.getPropertyDescriptors()){
              if(prop.getName().equals(proName)){
                 return prop.getReadMethod().getReturnType();
              }
          }         
          for(java.lang.reflect.Field field : obj.getClass().getFields()){
              if( field.getName().equals(proName)){
                  return field.getType();
              }
          }
          return null;
     }
     
     /**
      * 把obj转成type类型
      * @param type
      * @param obj
      * @return
      */
     public static Object getValue(Class<?> type,Object obj){
         String className = type.getName();
         if(obj.getClass() == type){
             return obj;
         }
         if(type .equals(Double.class) ||className=="double"){
             return Double.parseDouble(obj.toString());
         }
         if(type==Float.class||className=="float"){
             return Float.parseFloat(obj.toString());
         }
         if(type==Integer.class||className=="int"){
             return Integer.parseInt(obj.toString());
         }
         if(type.equals( String.class)||className=="string"){
             return obj.toString();
         }
         if(type.equals(Boolean.class)||className=="boolean"){
             return Boolean.parseBoolean(obj.toString());
         }
         if(type.isEnum()){
             Class<?>[] params = new Class<?>[1];
             params[0] = String.class;
             try {
                 return type.getDeclaredMethod("valueOf", params).invoke(null, obj.toString());
             } catch (SecurityException e) {
                 e.printStackTrace();
             } catch (NoSuchMethodException e) {
                 e.printStackTrace();
             } catch (IllegalArgumentException e) {
                 e.printStackTrace();
             } catch (IllegalAccessException e) {
                 e.printStackTrace();
             } catch (InvocationTargetException e) {
                 e.printStackTrace();
             }
         }
         //if(type.equals(Enum))
         return null;
     }
     
     public static void main(String[] argc){
         OutputFormat format = OutputFormat.BINARY;
         //OutputFormat.valueOf(name)
         //format.valueOf(name)
         OutputFormat myEnum= (OutputFormat) getValue(format.getClass(),"BINARY");
         System.out.println(format.toString());
     }
 }
2
5
分享到:
评论

相关推荐

    java转换xml、list、map和json

    "java转换xml、list、map和json" 本文主要讲述了Java中将xml、list、map和json之间的转换的相关知识点。 xml和map之间的转换 在Java中,xml和map之间的转换可以通过使用dom4j库来实现。dom4j是一个Java开源库,...

    map/list集合转化成xml字符串 xml字符串转化成map/list集合

    同样的,你可以创建一个解析器来将XML字符串解析成`List`对象,但你需要知道预期的XML结构以便正确地构建对象。 在实际项目中,通常会有更复杂的XML结构,可能包含嵌套的Map和List,这可能需要递归方法或额外的逻辑...

    Java xml 转 map

    1. **解析XML**:首先,你需要使用Java的内置库如`javax.xml.parsers.DocumentBuilderFactory`来创建一个`DocumentBuilder`实例,然后使用这个实例解析XML字符串或文件,得到一个`Document`对象。这一步骤用于将XML...

    java转换xml、list、map和json.pdf

    在Java开发中,数据交换和存储经常涉及XML、JSON以及List和Map之间的转换。XML(eXtensible Markup Language)是一种用于标记数据的格式,而JSON(JavaScript Object Notation)则是一种轻量级的数据交换格式,两者...

    Java读取json文件,并转化为map取值

    如果JSON包含嵌套的对象或数组,它们会被转换为`Map`或`List`。 对于Map取值,你可以使用`get`方法: ```java String key = "exampleKey"; Object value = jsonData.get(key); ``` 如果值是另一个JSON对象或数组...

    java转换xml、list、map和json[借鉴].pdf

    Java在软件开发中经常涉及到数据格式的转换,如XML、List、Map以及JSON之间的相互转换。这些转换在处理数据交换、API调用或是序列化时非常常见。以下是一些关于如何在Java中进行这些转换的知识点: 1. JSON转换: ...

    castor :Java与xml互转示例---代码

    Castor是基于Java的,它通过生成Java类来解析XML文档,或者将Java对象转换为XML。它的核心功能包括: - **XML到Java对象的绑定(XML Binding)**:将XML文档解析成Java对象模型。 - **Java对象到XML的序列化**:将...

    java转换xml、list、map和json.docx

    在Java开发中,XML、List、Map和JSON之间的转换是常见的需求。XML用于数据交换,而JSON则常用于前后端的数据传输。以下是一些关于如何在Java中进行这些转换的关键知识点: 1. **XML到Map转换**: - 使用`...

    java操作xml增删改查.pdf

    "Java 操作 XML 增删改查" 在 Java 中操作 XML 文档有多种方式,常见的有 DOM、DOM4J、JDOM 和 SAX。每种方式都有其优缺,选择哪种方式取决于具体的项目需求。 DOM DOM(Document Object Model)是 W3C 推荐的一...

    Objective-c对象组装XML

    4 利用解析类解析并展现到UIView 部分代码如下: @implementation XmlPackage @synthesize obj; @synthesize isList; @synthesize xmlString; @synthesize objectName; @synthesize lvUp; @synthesize root; @...

    json-lib JsonUtils 工具类,json-lib 工具类

    除了`JsonUtils`之外,`json-lib`库还包括其他工具类,如`JSONArray`, `JSONObject`, `JSONTokener`等,它们分别对应JSON的数组、对象和解析器,提供了丰富的API供开发者使用。 总的来说,`json-lib`的`JsonUtils`...

    超级有影响力霸气的Java面试题大全文档

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    javaScript和java参考手册

    Java集合框架包括List、Set、Map等接口和实现,为处理对象数组提供了强大支持。此外,Java SE(标准版)和Java EE(企业版)还提供了丰富的API,如Swing用于桌面应用,Spring框架用于企业级开发。 对于初学者,理解...

    使用Java解析名称空间的方法.doc

    Java中的名称空间解析是处理XML文档时不可或缺的一部分,特别是在涉及XPath表达式时。XML名称空间用于区分具有相同本地名称但属于不同来源的元素和属性,防止命名冲突。名称空间通过URI(统一资源标识符)定义,并...

    DWR.xml配置文件说明书(含源码)

    然而没有办法将不同的集合类类型分别采用不同的转换方法.因为没有办法完全自动进行转换,我们可以应用dwr.xml文件的special signatures syntax配置部分设置类型的转换处理过程. 2.5 DOM Objects DWR 自动将DOM、DOM4J...

    java-json.zip

    3. **数据类型映射**:JSON中的数据类型与Java中的不完全相同,如JSON的数组对应Java的List或Array,JSON对象对应Java的Map。库如Jackson会自动进行类型转换。 4. **复杂JSON处理**:对于包含嵌套结构或复杂关系的...

    java常用API-适合初学者

    Java API,全称为Java应用程序接口,是Java编程语言的核心组成部分,包含了各种类库、接口和异常,为开发者提供了丰富的功能,使得开发Java程序变得更加高效和便捷。本资料“java常用API-适合初学者”旨在帮助初学者...

    Android XML数据解析简单示例

    在Android开发中,XML是一种常见的数据格式,用于存储和传输...对于大型XML文件,可能需要考虑使用SAX(简单API for XML)或StAX(Streaming API for XML)等基于事件的解析器,它们以更节省内存的方式处理XML数据。

    java处理xml的四种方式jdom/dom4j/dom/sax

    JDOM是一个针对Java平台的XML API,它提供了一个与Java集合类(如List和Map)紧密集成的XML模型。JDOM使用SAX或DOM作为底层解析器,但提供了更简单的接口。在JDOM中,你可以直接通过元素、属性和文本节点来操作XML...

Global site tag (gtag.js) - Google Analytics