加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml之SAX解析

发布时间:2020-12-16 00:02:48 所属栏目:百科 来源:网络整理
导读:1.什么是SAX(Simple API for XML)? 流模型中的推模型分析方式。通过事件驱动,每发现一个节点就引发一个事件,通过回调方法完成解析工作,解析XML文档的逻辑需要应用程序完成。 优点: 1、不需要等待所有数据都被处理,分析就能立即开始。 2、只在读取数据

1.什么是SAX(Simple API for XML)?

流模型中的推模型分析方式。通过事件驱动,每发现一个节点就引发一个事件,通过回调方法完成解析工作,解析XML文档的逻辑需要应用程序完成。

优点:
1、不需要等待所有数据都被处理,分析就能立即开始。
2、只在读取数据时检查数据,不需要保存在内存中。
3、可以在某个条件得到满足时停止解析,不必解析整个文档。
4、效率和性能较高,能解析大于系统内存的文档。

缺点:
1、需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),使用麻烦。
2、单向导航,很难同时访问同一文档的不同部分数据,不支持XPath。


代码示例 :

1、javabean一个;

public class Book {
	private String id;
	private String name;
	private String author;
	private String year;
	private String price;
	private String language;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	public String getLanguage() {
		return language;
	}
	public void setLanguage(String language) {
		this.language = language;
	}
	
	
}
2.解析类

public class SAXTestCreate {
	public void saxCreateXml() {
		// 1、创建一个SAXTransformerFactory一个对象
		SAXTransformerFactory sf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
		OutputStream in = null;
		try {
			// 2、通过SAXTransformerFactory创建一个TransformerHandler对象
			TransformerHandler handler = sf.newTransformerHandler();
			// 3、通过TransformerHandler对象获取Transformer对象(用于设置xml输出的样式和头)
			Transformer transformer = handler.getTransformer();
			// 设置没有其他的DTD(Document Type Defination 文档类型定义)规范
			transformer.setOutputProperty(OutputKeys.STANDALONE,"yes");
			// 设置编码格式,显式的显示在<?xml version="1.0" ?>中
			transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");
			// 设置换行
			transformer.setOutputProperty(OutputKeys.INDENT,"yes");
			// 文件输出
			File file = new File("emp.xml");
			// 确保file是存在的
			if (!file.exists()) {
				if (!file.createNewFile()) {
					throw new FileNotFoundException("文件创建失败!");
				}
			}
			// 4、创建输出流OutputStream对象
			in = new FileOutputStream(file);
			// 5、创建流Result对象
			Result result = new StreamResult(in);
			// 6、关联result,此时有了生成元素的方法(handler提供的方法)和装元素的容器(result对象)
			handler.setResult(result);
			// 打开文档
			handler.startDocument();
			// 属性设置
			AttributesImpl attr = new AttributesImpl();
			// 开始创建元素
			handler.startElement("","","employees",attr);
			attr.addAttribute("","Name","小黑");
			attr.addAttribute("","age","22");
			handler.startElement("","employee",attr);//
			attr.clear();
			attr.addAttribute("","德拉");
			attr.addAttribute("","23");
			handler.startElement("","salary",attr);
			handler.endElement("","salary");
			handler.endElement("","employee");//
			// 结束元素创建
			handler.endElement("","employees");
			// 关闭文档
			handler.endDocument();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 关闭流, 习惯不好,老是不喜欢关闭流
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

	public void createXML() {

		Book b1 = new Book();
		b1.setId("1");
		b1.setName("冰与火之歌");
		b1.setAuthor("乔治马丁");
		b1.setYear("2014");
		b1.setPrice("89");

		Book b2 = new Book();
		b2.setId("2");
		b2.setName("安徒生童话");
		b2.setAuthor("乔治马丁");
		b2.setYear("2004");
		b2.setPrice("77");
		b2.setLanguage("English");

		ArrayList<Book> bookList = new ArrayList<Book>();
		bookList.add(b1);
		bookList.add(b2);
		// 生成xml
		// 1.创建一个TransformerFactory类的对象
		SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
		try {
			// 2.通过SAXTransformerFactory对象创建一个TransformerHandler对象
			TransformerHandler handler = tff.newTransformerHandler();
			// 3.通过handler对象创建一个Transformer对象
			// Transformer tr = handler.getTransformer();
			// // 4.通过Transformer对象对生成的xml文件进行设置
			// // 设置xml的编码
			// tr.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
			// // 设置xml的“是否换行”
			// tr.setOutputProperty(OutputKeys.INDENT,"yes");
			// 5.创建一个Result对象
			File f = new File("src/res/newbooks.xml");
			if (!f.exists()) {
				f.createNewFile();
			}
			// 6.创建Result对象,并且使其与handler关联
			Result result = new StreamResult(new FileOutputStream(f));
			handler.setResult(result);
			// 7.利用handler对象进行xml文件内容的编写O
			// 打开document
			handler.startDocument();
			AttributesImpl attr = new AttributesImpl();
			handler.startElement("","bookstore",attr);

			for (Book book : bookList) {
				attr.clear();
				attr.addAttribute("","id",book.getId());
				handler.startElement("","book",attr);
				// 创建name节点
				if (book.getName() != null && !book.getName().trim().equals("")) {
					attr.clear();
					handler.startElement("","name",attr);
					handler.characters(book.getName().toCharArray(),book.getName().length());
					handler.endElement("","name");
				}
				// 创建year节点
				if (book.getYear() != null && !book.getYear().trim().equals("")) {
					attr.clear();
					handler.startElement("","year",attr);
					handler.characters(book.getYear().toCharArray(),book.getYear().length());
					handler.endElement("","year");
				}
				// 创建author节点
				if (book.getAuthor() != null && !book.getAuthor().trim().equals("")) {
					attr.clear();
					handler.startElement("","author",attr);
					handler.characters(book.getAuthor().toCharArray(),book.getAuthor().length());
					handler.endElement("","author");
				}
				// 创建price节点
				if (book.getPrice() != null && !book.getPrice().trim().equals("")) {
					attr.clear();
					handler.startElement("","price",attr);
					handler.characters(book.getPrice().toCharArray(),book.getPrice().length());
					handler.endElement("","price");
				}
				// 创建language节点
				if (book.getLanguage() != null && !book.getLanguage().trim().equals("")) {
					attr.clear();
					handler.startElement("","language",attr);
					handler.characters(book.getLanguage().toCharArray(),book.getLanguage().length());
					handler.endElement("","language");
				}
				handler.endElement("","book");
			}
			handler.endElement("","bookstore");
			// 关闭document
			handler.endDocument();

		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SAXTestCreate test = new SAXTestCreate();
//		test.createXML();
		test.saxCreateXml();
		
	}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读