引言:XML和J2EE密切的程度是不用说的了,由于我们的接口程序需要将别人发过来的XML文档信息进行处理,并持久化到数据库中。由于业务的不同,xml的格式也有所不同,不过执行的过程都是类似的,我们获得xml字符串信息并解析我们需要的信息,将这些信息持久化就ok了,这里存在的问题是随着业务的不同,xml格式不同需要将xml中的信息首先保存到不同的vo中,然后将vo持久化。这样反射机制就起了很大的作用。
1. 主函数
- public static void main(String[] args) {
-
- PaserXML p=new PaserXML();
- String xml="<?xml version='1.0' encoding='UTF-8'?> <root><Customer><id>1</id><name>ddd</name></Customer>"+
- "<order><orderId>2</orderId><orderName>nnmnmnmn</orderName></order></root>";
-
- p.parserByXpath2(xml);
- }
public static void main(String[] args) {
// TODO Auto-generated method stub
PaserXML p=new PaserXML();
String xml="<?xml version='1.0' encoding='UTF-8'?> <root><Customer><id>1</id><name>ddd</name></Customer>"+
"<order><orderId>2</orderId><orderName>nnmnmnmn</orderName></order></root>";
p.parserByXpath2(xml);
}
2. 利用XPath获得节点信息
-
-
-
-
-
-
-
- public void parserByXpath2(String xml){
-
- try {
- Reader in=new StringReader(xml);
- Document document=builder.build(in);
- Element root=document.getRootElement();
- / System.out.println(root.getName());
- Element o=(Element)org.jdom.xpath.XPath.selectSingleNode(root, "/root/order");
- OrderVO vo=new OrderVO();
- this.ElementTOVO(o, vo);
- System.out.println("vo.getOrderId()"+vo.getOrderId());
- System.out.println("vo.getOrderName()"+vo.getOrderName());
- } catch (JDOMException e) {
-
- e.printStackTrace();
- } catch (IOException e) {
-
- e.printStackTrace();
- }
-
- }
/**
* 利用反射机制实现的 将xml中的相关信息付给Vo
* 输入:String XML
* 返回: void
* 执行中---将XML数据 付给对应的VO :这里需要对命名进行规范
* */
public void parserByXpath2(String xml){
try {
Reader in=new StringReader(xml);
Document document=builder.build(in);
Element root=document.getRootElement();
// System.out.println(root.getName());
Element o=(Element)org.jdom.xpath.XPath.selectSingleNode(root, "/root/order");
OrderVO vo=new OrderVO();
this.ElementTOVO(o, vo);//真正执行将通过Xpath解析出来的节点下的 信息 付给 VO
System.out.println("vo.getOrderId()"+vo.getOrderId());
System.out.println("vo.getOrderName()"+vo.getOrderName());
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3. 反射机制实现set方法的动态调用
-
-
-
-
-
-
-
-
- public void ElementTOVO(Element e,Object vo){
-
- Class clazz=vo.getClass();
- Field fd=null;
- Method m=null;
- Class fType=null;
- String fName="";
- Element element=null;
- String xmlValue="";
- java.lang.reflect.Method[] method=clazz.getDeclaredMethods();
- java.lang.reflect.Field[] field=clazz.getDeclaredFields();
- for(int i=0;i<field.length;i++){
- fd=field[i];
- fName=fd.getName();
- fType=fd.getType();
- if("java.lang.String".equals(fType.getName())){
-
- element=e.getChild(fName);
- if(element==null){
- xmlValue=null;
- }
- else{
- xmlValue=element.getValue();
- }
- fName=fName.substring(0,1).toUpperCase()+fName.substring(1,fName.length());
-
- if(fName!=null){
- try {
- m=clazz.getMethod("set"+fName, new Class[]{fType});
-
- } catch (SecurityException e1) {
-
- e1.printStackTrace();
- } catch (NoSuchMethodException e1) {
-
- e1.printStackTrace();
- }
- }
- if(xmlValue!=null){
- try {
- System.out.println(xmlValue);
- m.invoke(vo, new Object[]{xmlValue});
-
- } catch (IllegalArgumentException e1) {
-
- e1.printStackTrace();
- } catch (IllegalAccessException e1) {
-
- e1.printStackTrace();
- } catch (InvocationTargetException e1) {
-
- e1.printStackTrace();
- }
- }
- }
- }
- }
posted on 2009-08-31 09:23
NG 阅读(535)
评论(0) 编辑 收藏