SAX, 전체 이름은 Simple API for XML이며 인터페이스이자 소프트웨어입니다. 패키지. XML 구문 분석의 대안입니다. SAX는 DOM 구문 분석과 다르며, 문서를 한 줄씩 스캔하여 스캔하면서 구문 분석합니다. 애플리케이션은 데이터를 읽을 때만 확인하기 때문에 데이터를 메모리에 저장할 필요가 없으며 이는 대용량 문서를 구문 분석할 때 큰 이점입니다.
SAX는 XML 처리를 위한 이벤트 기반 "푸시" 모델이지만 W3C 표준이지만 널리 알려진 API입니다. SAX 파서는 DOM과 같은 완전한 문서 트리를 구축하지 않습니다. 대신 문서를 읽을 때 일련의 이벤트를 활성화합니다. 이러한 이벤트는 이벤트 핸들러로 푸시되어 문서 콘텐츠에 대한 액세스를 제공합니다.
PS: SAX는 XML 파일을 수정할 수 없습니다. 작업을 추가합니다.
기술도 아주 좋은 DOM 파싱 솔루션이 SAX 등장하는 이유는 무엇인가요? 🎜>기술은 어떻습니까? 그 이유는 매우 간단합니다. 즉, DOM은 XML을 문서 트리 구조로 저장합니다. 즉, 을 한 번에 저장합니다. 🎜>XML을 메모리에 읽어 들입니다. 그러면 대용량 XML 파일에서는 이것이 불가능합니다. 그래서 SAX의 스캐닝과 파싱 기술이 탄생한 것이다.
개략도
SAX
구문 분석 허용 문서가 작동되기 전에 전체 문서가 로드될 때까지 기다리지 않고 문서를 읽을 때 처리할 문서를 처리합니다.
Java에서는 DefaultHandler 인터페이스를 상속하여 SAX를 개발할 수 있습니다. 파서.
SAX의 구문 분석 메커니즘은 이벤트 수신 메커니즘과 매우 유사합니다. 둘 다 이벤트가 트리거될 때까지 기다린 후 해당 메서드를 호출합니다.
가장 일반적으로 사용되는5 SAX 파서 이벤트:
1, startDocument(): SAX 파서가 스캔한 문서의 시작 위치를 표시합니다.
2, endDocument(), SAX 파서가 스캔한 문서의 끝 위치를 표시합니다.
3, startElement(), 이는 SAX 파서가 요소의 여는 태그.
4, 문자(), 이는 SAX 파서가 일부를 검사했음을 나타냅니다. 텍스트의 경우 char 배열 형식으로 저장된다는 점에 유의하세요.
5, endElement(), 이는 SAX 파서가 스캔했음을 나타냅니다. 요소의 닫는 태그입니다.
public void startDocument()
public void startElement(String uri , 문자열 localName, 문자열 qName,속성 속성)
uri - 네임스페이스 URI, 요소에 네임스페이스가 없는 경우 URI 또는 네임스페이스 처리가 수행되지 않는 경우 빈 문자열입니다.
localName - 로컬 이름(접두사 없음) 또는 네임스페이스 처리가 수행되지 않는 경우 빈 문자열입니다.
qName - 정규화된 이름(접두사 포함) 또는 정규화된 이름을 사용할 수 없는 경우 빈 문자열입니다.
속성 - 요소에 첨부된 속성입니다. 속성이 없으면 빈 속성 객체가 됩니다.
공개 공백 문자(char[] ch, int start, int length)
ch - 문서의 모든 문자 .
start - 문자 배열의 시작 위치입니다.
length - 문자 배열에서 사용할 문자 수입니다.
public void endElement(String uri, String localName, String qName)
uri - 네임스페이스 URI 또는 요소에 네임스페이스 URI가 없거나 네임스페이스 처리가 수행되지 않는 경우 빈 문자열입니다.
localName - 로컬 이름(접두사 없음) 또는 네임스페이스 처리가 수행되지 않는 경우 빈 문자열입니다.
qName - 정규화된 이름(접두사 포함) 또는 정규화된 이름을 사용할 수 없는 경우 빈 문자열입니다.
public void endDocument()
파서와 이벤트 핸들러를 함께 사용하면 XML 문서를 파싱할 수 있습니다. 파서는 JAXP의 API를 사용하여 SAX 파서 그런 다음 파서를 지정하여 특정 XML 문서를 파싱할 수 있습니다. 이벤트 핸들러는 프로그래머가 이벤트 핸들러의 메소드 매개변수를 통해 sax 파서로 구문 분석한 데이터를 쉽게 얻을 수 있으므로 이를 결정할 수 있습니다. 데이터를 처리하는 방법.
구문 분석 단계1, SAXParserFactory의 newInstance() 메소드는 Sax 파서 팩토리 객체를 가져옵니다. 2
,Sax 파서를 통해 newSAXParser() 메서드를 호출하여 획득 팩토리 객체 ParserSAXParser object3
, 파서 객체의parse 메서드 호출 파서를 이벤트 핸들러 객체
와 연결합니다. 사례:
XML6.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<班级 班次="1班" 编号="C1">
<学生 地址="湖南" 学号="n1" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1">
<名字>张三</名字>
<年龄>20</年龄>
<介绍>不错</介绍>
</学生>
<学生 学号="n2" 性别="女" 授课方式="面授" 朋友="n1 n3" 班级编号="C1">
<名字>李四</名字>
<年龄>18</年龄>
<介绍>很好</介绍>
</学生>
<学生 学号="n3" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1">
<名字>王五</名字>
<年龄>22</年龄>
<介绍>非常好</介绍>
</学生>
<学生 性别="男">
<名字>小明</名字>
<年龄>30</年龄>
<介绍>好</介绍>
</学生>
</班级>
package com.pc; import javax.xml.parsers.*; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class XML6{ //使用sax技术去解析xml文件 public static void main(String[] args) throws Exception, SAXException { // TODO Auto-generated method stub //1.创建SaxParserFactory SAXParserFactory spf=SAXParserFactory.newInstance(); //2.创建SaxParser 解析器 SAXParser saxParser=spf.newSAXParser(); //3 把xml文件和事件处理对象关联 saxParser.parse("src/com/pc/XML6.xml",new MyDefaultHandler2() ); } } // 只显示学生的名字和年龄 class MyDefaultHandler2 extends DefaultHandler{ private boolean isName=false; private boolean isAge=false; @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub String con=new String(ch,start,length); if(!con.trim().equals("")&&(isName||isAge)){ System.out.println(con); } isName=false; isAge=false; //super.characters(ch, start, length); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); } @Override public void endElement(String uri, String localName, String name) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, name); } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { // TODO Auto-generated method stub if(name.equals("名字")){ this.isName=true; }else if(name.equals("年龄")){ this.isAge=true; } } } //定义事件处理类 class MyDefaultHandler1 extends DefaultHandler{ //发现文档开始 @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("startDocument()"); super.startDocument(); } //发现xml文件中的一个元素 @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { // TODO Auto-generated method stub System.out.println("元素名称="+name); } //发现xml文件中的文本 @Override public void characters(char[] ch, int start, int length) throws SAXException { String con=new String(ch,start,length); //显示文本内容: if(!con.trim().equals("")){ System.out.println(new String(ch,start,length)); } } //发现xml文件中一个元素介绍</xx> @Override public void endElement(String uri, String localName, String name) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, name); } //发现文档结束 @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("endDocument()"); super.endDocument(); } }