Java操作XML(2)--SAX方式处理XML
2021-03-07 08:28
标签:abc key ext amr 工厂 xmlns clear 节点 函数实现 SAX是一个用于处理XML事件驱动的“推”模型,虽然它不是W3C标准,但它却是一个得到了广泛认可的API。本文主要介绍Java SAX方式处理XML,文中所使用到的软件版本:Java 1.8.0_191。 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。 1、采用事件驱动模式,对内存耗费比较小。 1、编码比较麻烦。 该例子演示如何使用SAX方式解析XML以及使用SAX方式来生成XML。 Java操作XML(2)--SAX方式处理XML 标签:abc key ext amr 工厂 xmlns clear 节点 函数实现 原文地址:https://www.cnblogs.com/wuyongyin/p/14268108.html1、SAX简介
1.1、SAX的优点
2、适用于只处理XML文件中的数据。1.2、SAX的缺点
2、很难同时访问XML文件中的多处不同数据。2、Java SAX方式操作XML
2.1、XML文件
xml version="1.0" encoding="utf-8" ?>
school:class xmlns:school="http://www.w3.org/TR/html4/school/">
school:student rollno="1" school:testattr="test">
school:firstname>cxx1school:firstname>
lastname>Bob1lastname>
nickname>stars1nickname>
marks>85marks>
school:student>
student rollno="2">
firstname>cxx2firstname>
lastname>Bob2lastname>
nickname>stars2nickname>
marks>85marks>
student>
student rollno="3">
firstname>cxx3firstname>
lastname>Bob3lastname>
nickname>stars3nickname>
marks>85marks>
student>
school:class>
2.2、Java代码例子
package com.abc.demo.general.xml;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayOutputStream;
public class SaxCase {
private static Logger logger = LoggerFactory.getLogger(DomCase.class);
/**
* 解析xml
* @throws Exception
*/
@Test
public void parse() throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SaxHandler handler = new SaxHandler(logger);
parser.parse(DomCase.class.getResourceAsStream("student.xml"), handler);
}
/**
* 生成xml
* @throws Exception
*/
@Test
public void toXml() throws Exception {
//创建SAX转换工厂
SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
TransformerHandler handler = factory.newTransformerHandler();
//创建handler转换器
Transformer transformer = handler.getTransformer();
//换行
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
ByteArrayOutputStream out = new ByteArrayOutputStream();
StreamResult streamResult = new StreamResult(out);
handler.setResult(streamResult);
AttributesImpl attributes = new AttributesImpl();
//打开doc对象
handler.startDocument();
handler.startElement("http://www.w3.org/TR/html4/school/", "", "school:class", null);
//第一个学生
attributes.clear();
attributes.addAttribute("", "", "rollno", "", "1");
attributes.addAttribute("", "", "school:testattr", "", "test");
handler.startElement("", "", "student", attributes);
handler.startElement("", "", "school:firstname", null);
handler.characters("cxx1".toCharArray(), 0, 4);
handler.endElement("", "", "school:firstname");
handler.startElement("", "", "lastname", null);
handler.characters("Bob1".toCharArray(), 0, 4);
handler.endElement("", "", "lastname");
handler.startElement("", "", "nickname", null);
handler.characters("stars1".toCharArray(), 0, 6);
handler.endElement("", "", "nickname");
handler.startElement("", "", "marks", null);
handler.characters("85".toCharArray(), 0, 2);
handler.endElement("", "", "marks");
handler.endElement("", "", "student");
//第二个学生
attributes.clear();
attributes.addAttribute("", "", "rollno", "", "2");
handler.startElement("", "", "student", attributes);
handler.startElement("", "", "firstname", null);
handler.characters("cxx2".toCharArray(), 0, 4);
handler.endElement("", "", "firstname");
handler.startElement("", "", "lastname", null);
handler.characters("Bob2".toCharArray(), 0, 4);
handler.endElement("", "", "lastname");
handler.startElement("", "", "nickname", null);
handler.characters("stars2".toCharArray(), 0, 6);
handler.endElement("", "", "nickname");
handler.startElement("", "", "marks", null);
handler.characters("85".toCharArray(), 0, 2);
handler.endElement("", "", "marks");
handler.endElement("", "", "student");
//第三个学生
attributes.clear();
attributes.addAttribute("", "", "rollno", "", "3");
handler.startElement("", "", "student", attributes);
handler.startElement("", "", "firstname", null);
handler.characters("cxx3".toCharArray(), 0, 4);
handler.endElement("", "", "firstname");
handler.startElement("", "", "lastname", null);
handler.characters("Bob3".toCharArray(), 0, 4);
handler.endElement("", "", "lastname");
handler.startElement("", "", "nickname", null);
handler.characters("stars3".toCharArray(), 0, 6);
handler.endElement("", "", "nickname");
handler.startElement("", "", "marks", null);
handler.characters("85".toCharArray(), 0, 2);
handler.endElement("", "", "marks");
handler.endElement("", "", "student");
handler.endElement("", "", "school:class");
handler.endDocument();
logger.info(out.toString());
}
}
class SaxHandler extends DefaultHandler {
private String value;
private Logger logger;
public SaxHandler(Logger logger) {
this.logger = logger;
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
logger.info("SAX解析开始");
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
logger.info("SAX解析结束");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.equals("student") || qName.equals("school:student")) {
logger.info("学生编号" + attributes.getValue("rollno"));
if (attributes.getValue("school:testattr") != null) {
logger.info("testattr=" + attributes.getValue("school:testattr"));
}
} else if (qName.equals("firstname") || qName.equals("lastname") || qName.equals("nickname") || qName.equals("marks")) {
//logger.info(qName + "开始");
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if (qName.equals("firstname") || qName.equals("school:firstname") || qName.equals("lastname") || qName.equals("nickname") || qName.equals("marks")) {
logger.info(qName + ":" + value);
}
}
@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("")) {
// logger.info("节点值是:" + value);
}
}
}
下一篇:初识python 基础了解
文章标题:Java操作XML(2)--SAX方式处理XML
文章链接:http://soscw.com/index.php/essay/61252.html