java中使用sax解析xml,以实体类集合的方式接受xml解析的值
来源:互联网 发布:tensorflow 谷歌 编辑:程序博客网 时间:2024/05/17 02:39
1.先编写要解析的xml文件:
<?xml version="1.0" encoding="utf-8"?><class><stu id="001"><name>Allen</name><sex>男</sex><age>20</age></stu><stu id="002"><name>namy</name><sex>女</sex><age>18</age></stu><stu id="003"><name>lufy</name><sex>男</sex><age>19</age></stu></class>
2.编写要转换的实体类:PersonBean
package com.xml.util;public class PersonBean {private String name;private String sex;private String age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}}
3.编写xml解析文件继承DefaultHandler
/** * 用SAX解析XML的Handler */package com.xml.util;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class Myhandler extends DefaultHandler { //存储正在解析的元素的数据 private Map<String,String> map=null; //存储所有解析的元素的数据 private List<Map<String,String>> list=null; private List<PersonBean> personList =null; PersonBean person =null; //正在解析的元素的名字 String currentTag=null; //正在解析的元素的元素值 String currentValue=null; //开始解析的元素 String nodeName=null; public Myhandler(String nodeName) { this.nodeName=nodeName; } public List<Map<String, String>> getList() { return list; } public List<PersonBean> getPersonList(){ return personList; } //开始解析文档,即开始解析XML根元素时调用该方法 @Override public void startDocument() throws SAXException { System.out.println("--startDocument()--"); //初始化Map list=new ArrayList<Map<String,String>>(); personList=new ArrayList<PersonBean>(); } //开始解析每个元素时都会调用该方法 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //判断正在解析的元素是不是开始解析的元素 System.out.println("--startElement()--"+qName); if(qName.equals(nodeName)){ map=new HashMap<String, String>(); person=new PersonBean(); } //判断正在解析的元素是否有属性值,如果有则将其全部取出并保存到map对象中,如:<person id="00001"></person> if(attributes!=null&&map!=null){ for(int i=0;i<attributes.getLength();i++){ map.put(attributes.getQName(i), attributes.getValue(i)); } } currentTag=qName; //正在解析的元素 } //解析到每个元素的内容时会调用此方法 @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.println("--characters()--"); if(currentTag!=null&&map!=null){ currentValue=new String(ch,start,length); //如果内容不为空和空格,也不是换行符则将该元素名和值和存入map中 if(currentValue!=null&&!currentValue.trim().equals("")&&!currentValue.trim().equals("\n")){ map.put(currentTag, currentValue); Field[] allFields = PersonBean.class.getDeclaredFields(); for (int i = 0; i < allFields.length; i++) { if(allFields[i].getName().equals(currentTag)){ String firstLetter = allFields[i].getName().substring(0, 1) .toUpperCase(); String setter = "set" + firstLetter + allFields[i].getName().substring(1); try { Method method = person.getClass().getMethod(setter,allFields[i].getType()); try { method.invoke(person, currentValue); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } } System.out.println("-----"+currentTag+": "+currentValue); } //当前的元素已解析过,将其置空用于下一个元素的解析 currentTag=null; currentValue=null; } } //每个元素结束的时候都会调用该方法 @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub System.out.println("--endElement()--"+qName); //判断是否为一个节点结束的元素标签 if(qName.equals(nodeName)){ list.add(map); map=null; } if(qName.equals("age")){ personList.add(person); person=null; } } //结束解析文档,即解析根元素结束标签时调用该方法 @Override public void endDocument() throws SAXException { System.out.println("--endDocument()--"); super.endDocument(); }}
4.解析xml的方法
/** * 封装解析业务类 */package com.xml.service;import java.io.InputStream;import java.util.List;import java.util.Map;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import com.xml.util.Myhandler;import com.xml.util.PersonBean;public class SaxService { public static List<Map<String,String>> ReadXML(String uri,String NodeName){ try { //创建一个解析XML的工厂对象 SAXParserFactory parserFactory=SAXParserFactory.newInstance(); //创建一个解析XML的对象 SAXParser parser=parserFactory.newSAXParser(); //创建一个解析助手类 Myhandler myhandler=new Myhandler("stu"); parser.parse(uri, myhandler); return myhandler.getList(); } catch (Exception e) { e.printStackTrace(); }finally{ } return null; } public static List<PersonBean> Read2XML(String uri,String NodeName){ try { //创建一个解析XML的工厂对象 SAXParserFactory parserFactory=SAXParserFactory.newInstance(); //创建一个解析XML的对象 SAXParser parser=parserFactory.newSAXParser(); //创建一个解析助手类 Myhandler myhandler=new Myhandler("stu"); parser.parse(uri, myhandler); return myhandler.getPersonList(); } catch (Exception e) { e.printStackTrace(); }finally{ } return null; } }
5.编写main主方法调用解析代码:
/** * 程序入口 */package com.xml.sax;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import com.xml.service.SaxService;import com.xml.util.PersonBean;public class XmlSaxTest { /** * @param args */ public static void main(String[] args) { ArrayList<Map<String, String>> list=(ArrayList<Map<String, String>>) SaxService.ReadXML("D:\\Program Files\\DNA Workspace\\Test\\myClass.xml","class"); /*for(int i=0;i<list.size();i++){ HashMap<String, String> temp=(HashMap<String, String>) list.get(i); Iterator<String> iterator=temp.keySet().iterator(); while(iterator.hasNext()){ String key=iterator.next().toString(); String value=temp.get(key); System.out.print(key+" "+value+"--"); } }*/ List<PersonBean> personList =SaxService.Read2XML("D:\\Program Files\\DNA Workspace\\Test\\myClass.xml","class"); System.out.println(list.toString()); System.out.println("最新的xml解析:"+personList.toString()); }}
源码下载地址:http://download.csdn.net/detail/w2393040183/9582334
0 0
- java中使用sax解析xml,以实体类集合的方式接受xml解析的值
- Java中使用SAX方式解析XML的问题
- Android中XML的SAX解析方式
- java XML的SAX解析方式
- 使用sax解析xml文件,并自动根据实体类class得到映射后的实体类list集合
- Sax的Xml解析方式
- XML的解析 SAX方式
- Android中SAX解析XML的使用
- xml解析的sax解析方式
- java中使用sax解析xml的解决方法
- java中使用sax解析xml的解决方法
- java中使用sax解析xml的解决方法
- java中使用sax解析xml的解决方法
- java解析xml的几种方式 SAX解析
- XML解析-SAX的使用
- Java中SAX方式解析XML
- 使用SAX方式解析XML
- java解析xml(sax方式)
- 挂载swap,解决内存不足的编译错误
- ORACLE 用户和其下的对象
- 51nod 1268 DFS
- 五 skylable客户端操作
- nginx配置引发的403问题
- java中使用sax解析xml,以实体类集合的方式接受xml解析的值
- ios打包ipa的四种实用方法(.app转.ipa)
- MFC学习笔记——CDialog(为控件添加消息处理函数)
- [CodeChef-LTIME36]Akhil Recovers The Lost Array
- 悲观锁和乐观锁
- vim与复制,删除,粘贴,块操作以及快速替换功能
- 【腾讯Bugly干货分享】浅谈Android自定义锁屏页的发车姿势
- Block循环引用问题
- [poj 1961]Period[kmp]