最近不太忙,发现现在服务之间的交互都是通过xml进行的,所以今天理了一下xml的两种解析方式。首先是最流行的dom4j解析。先解析,然后通过反射转成对象。
用到的jar:dom4j-1.6.1.jar jaxen-1.1.1.jar
1.xml字符串转成对象:
/**
* 解析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面向对象解析xml 含递归小算法
SOAP 即Simple Object Access Protocol(简单对象访问协议)。不会还没听说过吧, 地球上的人都知道啊。SOAP 正成为Web 编程世界最炙手可热的概念,而且还是席 卷最新一代Web 开发的Web 服务热潮的组成部分。如果你...
使用dom4j解析xml,包括节点的操作、属性的操作、document对象写入新文件等操作。
使用 dom4j 将 XML 文档解析为我自己的格式 格式: 私人字符串名称; 私有字符串值; 私人列表 childList; private Map<String> propMap = new HashMap(); 意义 将 XML 文档对象转换成这个格式对象(XmlElement...
使用 dom4j 解析 XML;dom4j 是一种解析 XML 文档的开放源代码 XML 框架。本文介绍如何使用包含在 dom4j 中的解析器创建并修改 XML 文档。
DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。 DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型,就能使用。 Dom:把整个...
dom4j 目录的介绍: 1)docs 是文档目录 2)如何查 Dom4j 的文档 3)Dom4j 快速入门 2)lib 目录 ...第三方的解析: jdom 在 dom 基础上进行了封装、 dom4j 又对 jdom 进行了封装。 pull 主要用在 And
Dom4j解析xml的jar包,Dom4J常用的对象:SAXReader:读取xml文件到Document树结构文件对象。Document:是一个xml文档对象树,类比Html文档对象。Element:元素节点。通过Document对象可以查找单个元素
dom4j的各种用法 读取XML文件,获得document对象.解析XML形式的文本,得到document对象.
XML_StuGradeExam_domXML解析技术之dom、Sax、dom4j技术演习以及Schema XML文档约束##XML解析开发包Jaxp(sun)Jdomdom4j####ExamExam是一个使用Xml持久化保存数据的xml数据库,该项目是演练dom解析XML技术很好的一个...
dom4j用于解析xml 文档,而XStream则是将Java对象转成xml文件。使用这两个工具就很好的解决了xml文件的解析与Java对象转成xml的麻烦了!
简单的xml解析,生成例子 public void characters(char[] c, int start, int end) throws SAXException { String s = mystack.peek().toString(); System.out.println("栈顶对象为"+s+"\t"+"当前栈区大小为"+...
} <br> /** * 修改XML文件中内容,并另存为一个新文件 * 重点掌握dom4j中如何添加节点,修改节点,删除节点 * @param filename 修改对象文件 * @param newfilename 修改后另存为该文件 * @...
基于Java集合框架的XML文档对象模型 Java 5+ 泛型支持
通过dom4j解析配置文件,得到list集合(存放Bean标签的id和class属性) * 3.通过反射实例化得到对应的实例化对象,放置在map中(map是键值对,可根据id获取值)(遍历list获取对应的class属性,利用class。formName...
xml 解析 dom 文档对象模型(随机访问) 效率慢 受大小限制(10M) SAX 事件驱动(效率高,不受大小限制) 一、Dom4j下载及使用Dom4j读写XML简介: 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站...
java解析xml四种方式 DOM (Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的标准接口, DOM采用建立树形结构的方式访问XML文档. SAX(Simple API for XML) 不是某个官方标准,但它是 XML 社区事实...
获得文档解析器工厂对象 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); // 2. 获得文档解析器对象 DocumentBuilder documentBuilder = documentBuilderFactory....
解析XML文件使用的核心类 read() --> XML文件Document对象 Document document = new SAXReader().read(new File("./xml/User.xml")); Document对象中可以使用方法 Element getRootElement(); ...
解析器的介绍 文档对象模型(DOM)解析实例 SAX解析实例 DOM4J解析实例 JDOM解析实例 JAVA操纵XML 实例讲解