SAX, le nom complet est API simple pour XML, qui est à la fois une interface et un logiciel emballer. C'est une alternative à l'analyse XML. SAX est différent de l'analyse DOM Il numérise le document ligne par ligne et l'analyse pendant la numérisation. Étant donné que l'application vérifie uniquement les données au fur et à mesure de leur lecture, il n'est pas nécessaire de stocker les données en mémoire, ce qui constitue un énorme avantage lors de l'analyse de documents volumineux.
SAX est un modèle "push" événementiel pour le traitement du XML, bien qu'il ne soit pas W3C standard, mais il s'agit d'une API largement reconnue. L'analyseur SAX ne construit pas une arborescence de document complète comme DOM. Au lieu de cela, il active une série d'événements lors de la lecture du document. Ces événements sont transmis aux gestionnaires d'événements, qui donnent ensuite accès au contenu du document.
PS : SAX ne peut pas modifier le fichier XML, Supprimer et ajouter des opérations.
DOM est également une très bonne solution d'analyse DOM Pourquoi SAX apparaît-il ? 🎜>Et la technologie ? La raison est très simple, c'est-à-dire que DOM enregistre XML dans la structure d'une arborescence de documents, ce qui signifie que est enregistré en une seule fois. 🎜>XML est lu en mémoire, cela n'est donc pas possible dans les gros fichiers XML. C'est pourquoi la technologie de numérisation et d'analyse de SAX a été produite.
SAX analyse Permet le document à traiter lors de la lecture du document, sans avoir à attendre que l'intégralité du document soit chargée avant d'exploiter le document.
En Java, en héritant de l'interface DefaultHandler , vous pouvez développer un SAX Parseur.
Le mécanisme d'analyse de SAX est très similaire au mécanisme d'écoute d'événement. Ils attendent tous deux qu'un événement soit déclenché puis appellent la méthode correspondante.
Les 5 événements de l'analyseur SAX les plus couramment utilisés :
1, startDocument() : Ceci marque la position de départ du document numérisé par l'analyseur SAX.
2, endDocument(), qui marque la position de fin du document numérisé par l'analyseur SAX.
3, startElement(), qui indique que l'analyseur SAX a scanné The balise d'ouverture d'un élément.
4, character(), qui indique que l'analyseur SAX a scanné Some texte, notez qu'il est stocké sous la forme d'un tableau char.
5, endElement(), qui indique que l'analyseur SAX a scanné La balise fermante d'un élément.
public void startDocument()
public void startElement(String uri , String localName, String qName,Attributes attributs)
uri - Namespace URI, si l'élément n'a pas d'espace de noms URI, ou la chaîne vide si aucun traitement d'espace de noms n'est effectué.
localName - Nom local (sans préfixe), ou la chaîne vide si aucun traitement d'espace de noms n'est effectué.
qName - Nom qualifié (avec préfixe), ou la chaîne vide si le nom qualifié n'est pas disponible.
attributs - Attributs attachés à l'élément. S'il n'y a pas d'attributs, ce sera un objet Attributs vide.
caractères publics vides (char[] ch, int start, int length)
ch - Tous les caractères du document .
start - La position de départ dans le tableau de caractères.
longueur - Le nombre de caractères à utiliser dans le tableau de caractères.
public void endElement(String uri, String localName, String qName)
uri - Espace de noms URI, ou la chaîne vide si l'élément n'a pas d'espace de noms URI, ou si aucun traitement d'espace de noms n'est effectué.
localName - Nom local (sans préfixe), ou la chaîne vide si aucun traitement d'espace de noms n'est effectué.
qName - Nom qualifié (avec préfixe), ou la chaîne vide si le nom qualifié n'est pas disponible.
public void endDocument()
En utilisant ensemble l'analyseur et le gestionnaire d'événements, vous pouvez analyser le document XML. L'analyseur peut être créé à l'aide de l'API de JAXP pour créer le SAX analyseur Après cela, vous pouvez spécifier l'analyseur pour analyser un certain document XML. Le gestionnaire d'événements est écrit par le programmeur. Grâce aux paramètres de la méthode dans le gestionnaire d'événements, le programmeur peut facilement obtenir les données analysées par l'analyseur sax, afin qu'il puisse décider. comment les traiter. Les données sont traitées.
Étape d'analyse
1, en appelant SAXParserFactory > La méthode newInstance() obtient l'objet fabrique de l'analyseur Sax.
2, obtenu en appelant la méthode newSAXParser() via l'analyseur Sax objet d'usine ParserSAXParser objet
3, en appelant la méthode parse de l'objet analyseur Associer l'analyseur à l'objet gestionnaire d'événements
Cas :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(); } }