最近不太忙,发现现在服务之间的交互都是通过xml进行的,所以今天理了一下xml的两种解析方式。首先是最流行的dom4j解析。先解析,然后通过反射转成对象。

用到的jar:dom4j-1.6.1.jar jaxen-1.1.1.jar

1.xml字符串转成对象:

class="java" name="code">

/**

* 解析XMl字符串数据,转化成对象,并返回

* @param xml xml字符串数据

* @param xpathPattern xpath的匹配模式;具体语法请查XPath的语法

* @param classType 要转化对象的类型

* @return 返回用xml数据实例化之后的对象

*/

@SuppressWarnings({ "unchecked", "rawtypes" })

public static Object parseXmlStr(String xml, String xpathPattern, Class classType)

{

try

{

Document doc = DocumentHelper.parseText(xml);

List nodes = doc.selectNodes(xpathPattern);

// Element root = doc.getRootElement();

// List nodes = root.selectNodes("user");

List objs = new ArrayList();

for(Node node : nodes)

{

Map map = traverse(node);

if(classType == String.class)

{

objs.add(map.values().toArray()[0]);

}

else

{

objs.add(nodeToBean(map, classType));

}

}

return objs;

}

catch(Exception e)

{

e.printStackTrace();

return null;

}

}

2.解析xml文件转成对象:

/**

* 解析XMl文件,转化成对象,并返回

* @param xmlPath:xml文件路径(绝对路径)

* @param xpathPattern xpath的匹配模式;具体语法请查XPath的语法

* @param classType 要转化对象的类型

* @return 返回用xml数据实例化之后的对象

*/

@SuppressWarnings({ "unchecked", "rawtypes" })

public static Object parseXmlFile(String xmlPath, String xpathPattern, Class classType)

{

try {

SAXReader reader = new SAXReader();

Document doc = reader.read(new File(xmlPath));

List nodes = doc.selectNodes(xpathPattern);

List objs = new ArrayList();

for(Node node : nodes)

{

Map map = traverse(node);

if(classType == String.class)

{

objs.add(map.values().toArray()[0]);

}

else

{

objs.add(nodeToBean(map, classType));

}

}

return objs;

} catch (DocumentException e) {

e.printStackTrace();

return null;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

3.用到的辅助方法:

/**

* 从找出的Node节点开始,遍历所有子节点,获取子节点的数据

* @param node:Node节点

* @return 返回节点的值

*/

private static Map traverse(Node node)

{

Map map = new HashMap();

if(node instanceof Element)

{

map = treeWalk((Element)node, map);

}

else

{

map.put(node.getName(), node.getText());

}

return map;

}

/**

* 递归法提取节点的值

* @param element: 节点

* @param map: 保存节点的值

*/

private static Map treeWalk(Element element, Map map)

{

//遍历该元素自身的属性

int as= element.attributeCount();

for(int j=0;j map, Class classType) throws Exception

{

Field[] fields = classType.getDeclaredFields();//返回该类型的所有子属性(包含他继承的类和接口的)

Object obj = classType.getConstructor().newInstance();//创建该类型的实例

for(Field field : fields)

{

//属性名

String fieldName = field.getName();

if(!map.containsKey(fieldName))

{

continue;

}

//因为解析出来都是String类型的,所以创建一个String类型转换成field.getType类型的构造器

Constructor> con = field.getType().getConstructor(String.class);//

Object param = con.newInstance(map.get(fieldName));//通过构造器把字符串转换成field.getType类型的实例

fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);//首字母大写

//根据方法的命名规范,获取该属性的set方法

String methodName = "set" + fieldName;

Method method = classType.getMethod(methodName, field.getType());//获取setter方法把值set到对象实例中

method.invoke(obj, param);

}

return obj;

}

4.测试方法:

public static void main(String[] args) {

String xml = ""+

"123345"+

"duansha0327duansha"+

"zhangdaihaomima"+

"";

String xmlPath = "D:/testXml/user.xml";

// List us = (List) Dom4jXml.parseXmlStr(xml, "/users/user[last()]", User.class);

List us = (List) Dom4jXml.parseXmlFile(xmlPath, "/users/user[last()]", User.class);

if(null != us && us.size()>0)

{

for(User u:us)

{

System.out.println("Id="+u.getId()+" ;userName="+u.getUsername()+" ;passWord"+u.getPassword());

}

}

else

{

System.out.println("解析失败...");

}

}

5.XPath的语法参考:http://www.w3school.com.cn/xpath/xpath_syntax.asp

dom4j java对象_dom4j解析XML成对象相关推荐

  1. java dom解析xml字符串_dom4j解析xml字符串实例

    java部分 DOM4J 与利用DOM.SAX.JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异.功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文 ...

  2. Java用SAX解析XML

    2019独角兽企业重金招聘Python工程师标准>>> Myhandler package com.heli.xml.sax;/*** 用SAX解析XML的Handler*/ imp ...

  3. Java:PULLXML解析XML(内附jar包链接)

    Java:PULLXML解析XML 资源下载: https://download.csdn.net/download/qq_34810707/10778410 或者https://share.weiy ...

  4. xml对java通讯录的解析_Dom4j解析xml格式通讯录文档

    JDBC连接数据库,进行DOM4j解析的类: AnalyzeXML.Java package xml; import java.io.File; import java.io.FileInputStr ...

  5. JAXB解析XML为对象

    JAXB支持注解将XML转化为对象,具体看一个简单的例子: <?xml version="1.0" encoding="utf-8"?> <A ...

  6. java如果把字符串转成对象_Java中的重复对象:不仅仅是字符串

    当Java应用程序消耗大量内存时,它本身就会出现问题,并可能导致GC压力增加和GC暂停时间过长.在我之前的一篇文章中,我讨论了Java中常见的内存浪费源:重复字符串.两个 java.lang.Stri ...

  7. java如果把字符串转成对象_为什么Java中的字符串对象是不可变的,有什么好处?...

    专注于Java领域优质技术号,欢迎关注 原创: 阿杜的世界 阅读本文大概需要 4分钟. 所谓不可变对象,是指一个对象在创建后,它的内部状态不会被改变的对象.这意味着当我们将一个不可变对象的引用赋值给某 ...

  8. Java中Dom解析XML

    DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息: 这种方式便于对XML节点的添加修改等,而且解析也很方便,然后它比较耗费内 ...

  9. java之DocumentBuilderFactory解析xml

    1.About documentBuilderFactory API description 1). javax.xml.parsers 包DocumentBuilderFactory创建DOM模式的 ...

最新文章

  1. AMD依然yes!官宣锐龙5000系列CPU,单核性能首次超越英特尔,苏妈:最好的游戏CPU!...
  2. NET130署名错误一事,改正也着实迅速
  3. 如何理解java中String的不可变性
  4. BLOB,TEXT GEOMETRY or JSON column 'xxx' can't have a default value query问题解决
  5. 25linux运行级别26如何找到root密码?27linux下面帮助指令
  6. echarts鼠标放上去不显示值
  7. [物理学与PDEs]第1章习题7 载流线圈的磁场
  8. 关于HTML(十)-------怎么提升网站页面打开加载速度优化
  9. Java-static概述
  10. LINUX C获取并设置环境变量
  11. Rhino(犀牛)的视口
  12. 来上海度过的第一个五一,我去了哪些地方?
  13. 我的奋斗,不需要任何理由
  14. 嵌入式开发 学习指导
  15. 华夏千秋事,风雨亦为之
  16. 51单片机教程:8*8 点阵显示字符、数字、简单汉字
  17. Stenffensen加速迭代法
  18. 过去一年,网易新闻是如何甩开对手的?
  19. 网易云音乐正式启动IPO 值不值五分之二个腾讯音乐?
  20. 第七章、Zigbee定位系统

热门文章

  1. linux中的防火墙如何配置,linux防火墙如何配置
  2. new一个对象竟然不是原子操作?
  3. Java计算机毕业设计甜心驿站饮品信息管理源码+系统+数据库+lw文档
  4. 阿里CEO张勇首谈商业未来:大数据将成新能源
  5. 手机端模拟考试 —— 选择试题后的提交答案操作
  6. 【Python】图片搬家demo例子
  7. 蓝牙耳机哪个品牌最好?总结四大蓝牙耳机品牌排行榜
  8. 三星s20可以更新android11吗,三星GalaxyS20FE通过一个UI 3.0获得Android 11更新
  9. js对象转字符串的方法
  10. 该主机与 Cloudera Manager Server 失去联系的时间过长。 该主机未与 Host Monitor 建立联系