XMl解析之—DOM解析与SAX解析
2016-07-02 19:46
344 查看
什么是XML(Extensible Markup Language 可扩展标记语言),xml是一个以文本来描述数据的文档
SAX是Simple API for XML的缩写
SAX是读取和操作xml数据更快,更轻量的方法。SAX允许在读取文档时就处理它,从而不必等整个文档被存储之后才来采取操作
。它不涉及DOM所必须得开销和概念跳跃。
SAX API是一个基于事件的API,适用于处理数据流,即随着数据的流动而依次处理数据
在其解析文档时发生一定事件的时候会通知开发者,当你对其相应时,不做保存的数据将会被抛弃
不占内存,灵活性差,顺序读取,速度快,适用于性能要求就高的设备上使用,如Android,不占内存
DOM解析示例:
SAX解析示例:
SAX解析需要一个DefaultHandler
然后是解析
定义一个需要解析的类对象
xml文件
JAVA解析XML通常是两种方式,DOM和SAX DOM:Document Object Model(文档对象模型) DOM的特性: 定义一组java接口,基于对象,与语言和平台无关将xml文档表示为树,在内存中解析和定义XML文档,允许随机 访问文档的不同部分 DOM解析XML DOM的优点,由于树在内存中是持久的,因此可以修改后更新。它还可以在任何时候在树中上下导航,API使用起来比较方便 常用于服务器
SAX是Simple API for XML的缩写
SAX是读取和操作xml数据更快,更轻量的方法。SAX允许在读取文档时就处理它,从而不必等整个文档被存储之后才来采取操作
。它不涉及DOM所必须得开销和概念跳跃。
SAX API是一个基于事件的API,适用于处理数据流,即随着数据的流动而依次处理数据
在其解析文档时发生一定事件的时候会通知开发者,当你对其相应时,不做保存的数据将会被抛弃
不占内存,灵活性差,顺序读取,速度快,适用于性能要求就高的设备上使用,如Android,不占内存
DOM解析示例:
public class DomParse { static Person p=new Person(); //DOM解析XML public static void main(String[] args) { try { DomPaseXml(); } catch (ParserConfigurationException e) { e.printStackTrace(); } } private static void DomPaseXml() throws ParserConfigurationException { try { //创建builder DocumentBuilderFactory builder=DocumentBuilderFactory.newInstance(); DocumentBuilder db = builder.newDocumentBuilder(); //解析路径 InputStream is=Thread.currentThread().getContextClassLoader() .getResourceAsStream("day0702XmlDemo/Demo.xml"); Document doc = db.parse(is); //从解析器中获取数据 //获取节点的列表 NodeList nl = doc.getElementsByTagName("person"); System.out.println(nl.getLength()); for(int j=0;j<nl.getLength();j++){ Node per = nl.item(j); System.out.println(per.getNodeName());; p.setPerson(per.getAttributes().getNamedItem("id").getNodeValue()); System.out.println(p.getPerson()); NodeList perlist = per.getChildNodes(); for(int l=0;l<perlist.getLength();l++){ Node pernode = perlist.item(l); String nodeName = pernode.getNodeName(); if("name".equals(nodeName)){ p.setName(pernode.getFirstChild().getNodeValue()); }else if(nodeName.equals("age")){ p.setAge(Integer.parseInt(pernode.getFirstChild().getNodeValue())); }else if(nodeName.equals("sex")){ p.setSex(pernode.getFirstChild().getNodeValue()); }else if(nodeName.equals("tel")){ p.setTel(Integer.parseInt(pernode.getFirstChild().getNodeValue())); } } System.out.println(p.toString()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
SAX解析示例:
SAX解析需要一个DefaultHandler
public class PersonHandler extends DefaultHandler{ private List<Person> list; Person p; String tag; public List<Person> getList() { return list; } //开始解析文档 @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); list=new ArrayList<Person>(); System.out.println("开始解析文档啦"); } //结束解析文档 @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("文档解析完毕"); } //开始标签 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub super.startElement(uri, localName, qName, attributes); if(qName.equals("person")){ p=new Person(); p.setPerson(attributes.getValue("id")); } tag=qName; } //结束标签 @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); if("person".equals(qName)){ list.add(p); } tag=null; } //解析文档的(包括空格) @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); if(tag!=null){ if("name".equals(tag)){ p.setName(new String(ch,start,length)); }else if("age".equals(tag)){ p.setAge(Integer.parseInt(new String(ch,start,length))); }else if("sex".equals(tag)){ p.setSex(new String(ch,start,length)); }else if("tel".equals(tag)){ p.setTel(Integer.parseInt(new String(ch,start,length))); } } } }
然后是解析
public class SAXParse { private static List<Person> list; public static void main(String[] args) { List<Person> saXpaseXml = SAXpaseXml(); for (Person person : saXpaseXml) { System.out.println(person.toString()); } } private static List<Person> SAXpaseXml() { try { //创建解析器 SAXParserFactory factory=SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); InputStream is=Thread.currentThread().getContextClassLoader() .getResourceAsStream("day0702XmlDemo/Demo.xml"); PersonHandler dh=new PersonHandler(); saxParser.parse(is, dh); list = dh.getList(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } }
定义一个需要解析的类对象
public class Person { String person; String name; int age; String sex; int tel; public String getPerson() { return person; } public void setPerson(String person) { this.person = person; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getTel() { return tel; } public void setTel(int tel) { this.tel = tel; } public Person() { super(); } protected Person(String person, String name, int age, String sex, int tel) { super(); this.person = person; this.name = name; this.age = age; this.sex = sex; this.tel = tel; } @Override public String toString() { return "Person [person=" + person + ", name=" + name + ", age=" + age + ", sex=" + sex + ", tel=" + tel + "]"; } }
xml文件
<?xml version="1.0" encoding="utf-8"?> <taiyuan> <person id="1"> <name>小郭</name> <age>23</age> <sex>男</sex> <tel>110</tel> </person> <person id="2"> <name>小王</name> <age>20</age> <sex>女</sex> <tel>112</tel> </person> </taiyuan>
相关文章推荐
- kwic--Java统计单词个数并按照顺序输出
- sql中decode()重要函数使用
- 醉逍遥天龙
- USB-SERIAL / PL2303 工作流程
- 面试题7:用两个栈实现队列
- Redis 和 Memcached 的区别详解
- 随机数产生代码的区别
- 01-Opencv-图像显示
- C语言中的static函数
- 【转】Spring中事务与aop的先后顺序问题
- Linux 环境下开启wifi热点
- windows+nginx+php运行环境部署
- 面试题 HashMap 数据结构 实现原理
- socket编程原理
- 中断
- OpenGL绘制图形以及绘制动画(一)
- bzoj4636: 蒟蒻的数列
- POJ-3253 Fence Repair
- Codeforces Round #357 (Div. 2) D DFS
- 基础控件篇(1)-UItableView