SAX, der vollständige Name ist Simple API for XML, das sowohl eine Schnittstelle als auch eine Software ist Paket. Es ist eine Alternative zum XML-Parsing. SAX unterscheidet sich von der DOM-Analyse. Es scannt das Dokument Zeile für Zeile und analysiert es beim Scannen. Da die Anwendung die Daten nur beim Lesen überprüft, ist es nicht erforderlich, die Daten im Speicher zu speichern, was beim Parsen großer Dokumente einen großen Vorteil darstellt.
SAX ist ein ereignisgesteuertes „Push“-Modell für die Verarbeitung von XML, obwohl es nicht W3CStandard, aber es ist eine weithin anerkannte API. Der SAX-Parser erstellt keinen vollständigen Dokumentbaum wie DOM, sondern aktiviert beim Lesen des Dokuments eine Reihe von Ereignissen. Diese Ereignisse werden an Ereignishandler weitergeleitet, die dann Zugriff auf den Dokumentinhalt ermöglichen.
PS: SAX kann die XML-Datei nicht ändern, löschen und Operationen hinzufügen.
Warum die-Technologie ist auch eine sehr gute DOM-Parsing-Lösung SAX 🎜>Was ist mit der Technologie? Der Grund ist ganz einfach: DOM speichert XML in der Struktur eines Dokumentbaums, was bedeutet, dass in einem Rutsch gespeichert wird. Aus diesem Grund wurde die Scan- und Parsing-Technologie von SAX geboren. Schema
SAX
SAX
Java
DefaultHandler
einSAX entwickeln Parser. Der Parsing-Mechanismus von SAX ist dem Event-Listening-Mechanismus sehr ähnlich. Beide warten darauf, dass ein Ereignis ausgelöst wird, und rufen dann die entsprechende Methode auf. Die am häufigsten verwendeten 5
Ereignisse von SAXParser:
1, startDocument(): Dies markiert die Startposition des vom
SAX-Parser gescannten Dokuments. 2, endDocument(), das die Endposition des vom SAX-Parsers gescannten Dokuments markiert. 3, startElement(), was anzeigt, dass der SAX Parser gescannt hat Eröffnungs-Tag eines Elements. 4, character(), was anzeigt, dass der SAX-Parser einige gescannt hat Beachten Sie, dass der Text in Form eines char-Arrays gespeichert wird. 5, endElement(), was anzeigt, dass der SAX-Parser gescannt hat Das schließende Tag eines Elements. public void startDocument() public void startElement(String uri , String localName, String qName,Attributes attributes) uri - Namespace URI, wenn das Element keinen Namespace hat URI oder die leere Zeichenfolge, wenn keine Namespace-Verarbeitung durchgeführt wird. localName – Lokaler Name (ohne Präfix) oder die leere Zeichenfolge, wenn keine Namespace-Verarbeitung durchgeführt wird. qName – Qualifizierter Name (mit Präfix) oder die leere Zeichenfolge, wenn kein qualifizierter Name verfügbar ist. Attribute – Attribute, die dem Element zugeordnet sind. Wenn keine Attribute vorhanden sind, handelt es sich um ein leeres Attributes -Objekt. öffentliche Leerzeichen (char[] ch, int start, int length) ch - Alle Zeichen des Dokuments . start – Die Startposition im Zeichenarray. Länge – Die Anzahl der zu verwendenden Zeichen aus dem Zeichenarray. public void endElement(String uri, String localName, String qName) uri - Namespace URI oder die leere Zeichenfolge, wenn das Element keinen Namespace URI hat oder wenn keine Namespace-Verarbeitung durchgeführt wird. localName – Lokaler Name (ohne Präfix) oder die leere Zeichenfolge, wenn keine Namespace-Verarbeitung durchgeführt wird. qName – Qualifizierter Name (mit Präfix) oder die leere Zeichenfolge, wenn kein qualifizierter Name verfügbar ist. public void endDocument() Durch die gemeinsame Verwendung des Parsers und des Ereignishandlers können Sie das XML-Dokument analysieren. Der -Parser kann mithilfe der API von JAXP erstellt werden, um das SAX Parser Danach können Sie den Parser angeben, der ein bestimmtes XML-Dokument analysiert. Der Ereignishandler wird vom Programmierer geschrieben. Über die Parameter der Methode im Ereignishandler kann der Programmierer die Daten einfach vom Sax-Parser analysieren lassen, sodass er entscheiden kann wie die Daten verarbeitet werden. , durch Aufrufen von SAXParserFactorys Die Methode newInstance() ruft das Parser-Factory-Objekt Sax ab. , erhalten durch Aufruf der Methode newSAXParser() über den Parser Sax Factory-Objekt-ParserSAXParser-Objekt , indem die parse-Methode des Parser-Objekts aufgerufen wird Parser mit Event-Handler-Objekt verknüpfen XML6.xml Liste der allgemeinen Methodenparameter des Ereignishandlers
Parsing-Methode
<?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();
}
}