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