dom4j java对象_dom4j解析XML成对象

dom4j java对象_dom4j解析XML成对象最近不太忙,发现现在服务之间的交互都是通过xml进行的,所以今天理了一下xml的两种解析方式。首先是最流行的dom4j解析。先解析,然后通过反射转成对象。用到的jar:dom4j-1.6.1.jarjaxen-1.1.1.jar1.xml字符串转成对象:class=”java”name=”code”>/***解析XMl字符串数据,转化成对象,并返回*@paramxmlxml字符串…

大家好,又见面了,我是你们的朋友全栈君。

最近不太忙,发现现在服务之间的交互都是通过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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152030.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • EasyPlayer支持YUV数据导出功能

    EasyPlayer支持YUV数据导出功能我们可能会遇到这样的功能,播放一个视频的同时,再把这个视频推送出去,或者对视频数据进行智能分析等处理.这样我们就迫切需要得到视频的原始数据.基于这个需求,EasyPlayer增加了获取视频YUV数据的功能.它的原理是这样的:CreatedwithRaphaël2.1.2EasyPlayerClientEasyPlayerClientDecoderDecoderYUVYUV读取媒体…

    2022年6月25日
    26
  • 最新版JDK、Eclipse安装教程

    摘要:本文详细介绍了在Windows下如何下载当前最新版的JDK及Eclipse以及具体安装步骤,并附软件安装包,最后介绍改变窗口风格、字体调整以及eclipse代码编辑缩进线(IndentGuide)插件的安装,使其编辑界面更加美观整洁。其要点如下:软件下载安装步骤界面优化前言   &am

    2022年4月7日
    252
  • 微信公众平台开发者社区_php微擎框架

    微信公众平台开发者社区_php微擎框架一、思考开发了几个微信项目,一直在思考:如何将微信相关的处理与业务系统联系在一起?如何做到彼此分离,且易于扩展?能否开发一套独立的微信服务框架,支持各种业务应用?二、现有常用的服务框架支持多种业务应用,我们通过分层的方式来实现。将复杂的系统进行分层,将一些功能或者特有的逻辑进行封装,封装为不同的基础服务或中间件。业务层无需关心底层具体实现,只需进行简单调用、组装

    2022年8月21日
    6
  • Python负数取余总结

    Python负数取余总结Python负数取余总结余数存在正余数和负余数,要了解负余数,需要先了解取整原理17//5=3-17//5=-417//-5=-4-17//-5=3根据上述的4个公式,可以看出python的编译器是的取整符号位由被除数和除数同时决定,整数的数值是由向下取整的,即如果整数的符号位正,则取靠近0的数,如果整数是负数,则取远离0的数或者也可以这样理解:被除数和除数处于0的一边就往靠0的方向取整,如果是处于0的两边就往远离0的方向取整。了解了取整原理后,再理解取余就比较简单了17

    2022年5月8日
    39
  • sql server 2008修改端口_sqlserver 端口

    sql server 2008修改端口_sqlserver 端口打开开始菜单,找到sqlserver的配置管理器,点击打开按下图配置右边窗口三项:按下图配置右边三项:按下图配置右边三项:点击下图左边的SQLServer网络配置/MSSQLSERVER的协议,然后在双击右边窗口的TCP/IP项,打开tcp/ip配置窗口。切换到ip地址选项卡,凡是tcp端口的,均把原来的默认端口1433改为1772。然后保存。在这个过程中,有几项的修改会有这样的提示:点击确定…

    2022年10月20日
    5
  • Cinemachine(四)在路径/轨道上移动的摄像头(Cinemachine Dolly Camera,Path And Cart)

    Cinemachine(四)在路径/轨道上移动的摄像头(Cinemachine Dolly Camera,Path And Cart)22

    2022年5月28日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号