用SAX解析xml文件
2018-07-18 01:18:11来源:博客园 阅读 ()
1、用SAX解析xml文件大致分为三步
(1)main方法代码如下:
import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class SAX { public static void main(String[] args) { //1、获取一个SAXParserFactory的实例 SAXParserFactory factory = SAXParserFactory.newInstance(); try { //2、通过factory获取SAXParser的实例 SAXParser parser = factory.newSAXParser(); //3、创建SAXParserHandler对象 SAXParserHandler handler = new SAXParserHandler(); parser.parse("book.xml", handler); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
(2)SAXParserHandler方法
package cn.edu.zzuli.SAXTest; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXParserHandler extends DefaultHandler { /** * 用来遍历xml文件的开始标签 */ @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); } /** * 用来遍历xml文件的结束标签 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); } /** * 用来表示解析开始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("SAX解析开始"); } /** * 用来表示解析结束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("SAX解析结束"); } }
当读到<?xml version="1.0" encoding="UTF-8"?>时解析开始,当读到最后一个节点结束标识(</>)解析结束
2、使用SAX解析节点名和节点间文本
重写SAXParserHandler类里的startElement方法
public class SAXParserHandler extends DefaultHandler { int bookindex = 1; /** * 用来遍历xml文件的开始标签 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //调用DefaultHandler类的startElement方法 super.startElement(uri, localName, qName, attributes); //开始解析book元素的属性 if(qName.equals("book")) { System.out.println("------------现在开始遍历第" + bookindex + "本书---------"); //已知book元素下属性的名称,根据名称获取属性值 String value = attributes.getValue("id"); System.out.println("book的属性值是:" + value); //不知道book元素下属性的名称以及个数,如何获取元素名称及属性 int num = attributes.getLength(); for(int i = 0;i < num;i++) { System.out.print("第" + (i + 1) + "个book元素的属性名是" + attributes.getQName(i)); System.out.println("----book元素的属性值是" + attributes.getValue(i)); } }else if(!qName.equals("book") && !qName.equals("bookstore")){ System.out.print("节点名是" + qName); } } /** * 用来遍历xml文件的结束标签 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); if(qName.equals("book")) { System.out.println("------------结束遍历第" + bookindex++ + "本书---------"); } } /** * 用来表示解析开始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("SAX解析开始"); } /** * 用来表示解析结束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("SAX解析结束"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); String value = new String(ch, start, length);
//通过trim()截掉空格和换行符,如果是空字符则跳过if执行语句 if(!value.trim().equals("")) System.out.println("节点值为" + value); } }
输出结果为:
(2)将book节点结构信息保存,用一个book类来保存
重新写SAXParserHandler类
public class SAXParserHandler extends DefaultHandler { int bookindex = 1; //定义全局变量是为了使book对象和value值可以被多个方法访问 Book book =null; String value = null; private ArrayList<Book> bookList = new ArrayList<>(); public ArrayList<Book> getBookList() { return bookList; } /** * 用来遍历xml文件的开始标签 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //调用DefaultHandler类的startElement方法 super.startElement(uri, localName, qName, attributes); //开始解析book元素的属性 if(qName.equals("book")) { //每一次遇到book就建立新的book对象 book = new Book(); System.out.println("------------现在开始遍历第" + bookindex + "本书---------"); //已知book元素下属性的名称,根据名称获取属性值 String value = attributes.getValue("id"); System.out.println("book的属性值是:" + value); //不知道book元素下属性的名称以及个数,如何获取元素名称及属性 int num = attributes.getLength(); for(int i = 0;i < num;i++) { System.out.print("第" + (i + 1) + "个book元素的属性名是" + attributes.getQName(i)); System.out.println("----book元素的属性值是" + attributes.getValue(i)); if(attributes.getQName(i) == "id") { book.setId(attributes.getValue(i)); } } }else if(!qName.equals("book") && !qName.equals("bookstore")){ System.out.print("节点名是" + qName); } } /** * 用来遍历xml文件的结束标签 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); if(qName.equals("book")) { //把信息存入book对象之后,加到ArrayList之中 bookList.add(book); //将book对象清空 book = null; System.out.println("------------结束遍历第" + bookindex++ + "本书---------"); }else if(qName.equals("name")) { book.setName(value); }else if(qName.equals("id")) { book.setId(value); }else if(qName.equals("year")) { book.setYear(value); }else if(qName.equals("money")) { book.setMoney(value); }else if(qName.equals("color")) { book.setColor(value); }else if(qName.equals("auther")) { book.setAuther(value); } } /** * 用来表示解析开始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("SAX解析开始"); } /** * 用来表示解析结束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("SAX解析结束"); }
/** * 用来求得节点值 */
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
value = new String(ch, start, length);
if(!value.trim().equals(""))
System.out.println("节点值为" + value);
}
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:移动文件(删除文件)
下一篇:java的数据类型
- JVM常见面试题解析 2020-06-11
- 深入解析ThreadLocal和ThreadLocalMap 2020-06-08
- dockerMesos配置项是怎么解析的?案例详解 2020-06-02
- 最新115道经典Java面试题及答案解析,快来看看你掌握了多少 2020-06-01
- Spark SQL源码解析(五)SparkPlan准备和执行阶段 2020-05-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash