Maison  >  Article  >  développement back-end  >  Solution pour utiliser Sax pour analyser XML en Java

Solution pour utiliser Sax pour analyser XML en Java

高洛峰
高洛峰original
2017-01-11 12:56:122269parcourir

En Java, il existe deux façons d'analyser les documents XML de manière native, à savoir : l'analyse Dom et l'analyse Sax.

L'analyse Dom est puissante et peut être ajoutée, supprimée, modifiée et vérifiée. Le document XML sera traité. en tant qu'objet document pendant le fonctionnement La méthode est lue dans la mémoire, elle convient donc aux petits documents

L'analyse Sax lit le contenu ligne par élément du début à la fin. C'est plus gênant à modifier, mais c'est le cas. adapté aux gros documents en lecture seule

Cet article explique principalement l'analyse Sax, et le reste sera laissé de côté

Sax utilise une approche événementielle pour analyser les documents. Pour faire simple, c'est comme regarder un film au cinéma. Vous pouvez le regarder du début à la fin sans revenir en arrière (Dom peut le lire d'avant en arrière)

En train de regarder un film, chaque. chaque fois que vous rencontrez un complot, une larme, un frottement d'épaule, vous mobiliserez votre cerveau et vos nerfs pour recevoir ou traiter cette information

De même, lors du processus d'analyse de Sax, en lisant le début et la fin du document, et le début et la fin de l'élément déclencheront certaines méthodes de rappel, vous pouvez effectuer le traitement des événements correspondant dans ces méthodes de rappel

Les quatre méthodes sont : startDocument(), endDocument(), startElement(), endElement

De plus, une lecture légère Il ne suffit pas d'aller au nœud. Nous avons également besoin de la méthode caractères() pour traiter soigneusement le contenu contenu dans l'élément

En rassemblant ces méthodes de rappel, une classe. est formé, qui est le déclencheur dont nous avons besoin.

Généralement, le document est lu à partir de la méthode Main, mais le document est traité dans le déclencheur. Il s'agit de la méthode dite d'analyse basée sur les événements

.

Solution pour utiliser Sax pour analyser XML en Java

Comme indiqué ci-dessus, dans le déclencheur, commencez d'abord à lire le document, puis commencez à analyser les éléments un par un. Le contenu de chaque élément sera renvoyé aux caractères().

puis terminez la lecture de l'élément. Une fois tous les éléments lus, terminez l'analyse du document

Maintenant, nous commençons à créer la classe déclencheur. Pour créer cette classe, nous devons d'abord hériter. DefaultHandler

pour créer SaxHandler et remplacer la méthode correspondante :

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

  
public class SaxHandler extends DefaultHandler { 

    /* 此方法有三个参数 
       arg0是传回来的字符数组,其包含元素内容 
       arg1和arg2分别是数组的开始位置和结束位置 */ 
    @Override 
    public void characters(char[] arg0, int arg1, int arg2) throws SAXException { 
        String content = new String(arg0, arg1, arg2); 
        System.out.println(content); 
        super.characters(arg0, arg1, arg2); 
    } 

    @Override 
    public void endDocument() throws SAXException { 
        System.out.println("\n…………结束解析文档…………"); 
        super.endDocument(); 
    } 

    /* arg0是名称空间 
       arg1是包含名称空间的标签,如果没有名称空间,则为空 
       arg2是不包含名称空间的标签 */ 
    @Override 
    public void endElement(String arg0, String arg1, String arg2) 
            throws SAXException { 
        System.out.println("结束解析元素  " + arg2); 
        super.endElement(arg0, arg1, arg2); 
    } 

    @Override 
    public void startDocument() throws SAXException { 
        System.out.println("…………开始解析文档…………\n"); 
        super.startDocument(); 
    } 

    /*arg0是名称空间 
      arg1是包含名称空间的标签,如果没有名称空间,则为空 
      arg2是不包含名称空间的标签 
      arg3很明显是属性的集合 */
    @Override
    public void startElement(String arg0, String arg1, String arg2, 
            Attributes arg3) throws SAXException { 
        System.out.println("开始解析元素 " + arg2); 
        if (arg3 != null) { 
            for (int i = 0; i < arg3.getLength(); i++) { 
                 // getQName()是获取属性名称, 
                System.out.print(arg3.getQName(i) + "=\"" + arg3.getValue(i) + "\""); 
            } 
        } 
        System.out.print(arg2 + ":"); 
        super.startElement(arg0, arg1, arg2, arg3); 
    } 
}

Document XML :

<?xml version="1.0" encoding="UTF-8"?>  
<books>  
   <book id="001">  
      <title>Harry Potter</title>  
      <author>J K. Rowling</author>  
   </book>  
   <book id="002">  
      <title>Learning XML</title>  
      <author>Erik T. Ray</author>  
   </book>  
</books>

Classe de test TestDemo :

import java.io.File; 

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

  
public class TestDemo { 

    public static void main(String[] args) throws Exception { 
        // 1.实例化SAXParserFactory对象 
        SAXParserFactory factory = SAXParserFactory.newInstance(); 
        // 2.创建解析器 
        SAXParser parser = factory.newSAXParser(); 
        // 3.获取需要解析的文档,生成解析器,最后解析文档 
        File f = new File("books.xml"); 
        SaxHandler dh = new SaxHandler(); 
        parser.parse(f, dh); 
    } 
}

Résultat de sortie :

…………开始解析文档………… 

开始解析元素 books 
books:  

开始解析元素 book 
id="001"book:  

开始解析元素 title 
title:Harry Potter 
结束解析元素  title 

        
开始解析元素 author 
author:J K. Rowling 
结束解析元素  author 

     
结束解析元素  book 

     
开始解析元素 book 
id="002"book:  

开始解析元素 title 
title:Learning XML 
结束解析元素  title 

        
开始解析元素 author 
author:Erik T. Ray 
结束解析元素  author 

     
结束解析元素  book 

  
结束解析元素  books 

…………结束解析文档…………

Bien que ce qui précède montre correctement le processus d'exécution, la sortie est très compliquée

Afin d'exécuter ce processus plus clairement, nous pouvons également réécrire SaxHandler pour restaurer l'original document xml

Classe SaxHandler réécrite :

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

  
public class SaxHandler extends DefaultHandler { 

    @Override
    public void characters(char[] arg0, int arg1, int arg2) throws SAXException { 
        System.out.print(new String(arg0, arg1, arg2)); 
        super.characters(arg0, arg1, arg2); 
    } 

    @Override
    public void endDocument() throws SAXException { 
        System.out.println("\n结束解析"); 
        super.endDocument(); 
    } 

    @Override
    public void endElement(String arg0, String arg1, String arg2) 
            throws SAXException { 
        System.out.print("</"); 
        System.out.print(arg2); 
        System.out.print(">"); 
        super.endElement(arg0, arg1, arg2); 
    } 

    @Override
    public void startDocument() throws SAXException { 
        System.out.println("开始解析"); 
        String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; 
        System.out.println(s); 
        super.startDocument(); 
    } 

    @Override
    public void startElement(String arg0, String arg1, String arg2, 
            Attributes arg3) throws SAXException { 

        System.out.print("<"); 
        System.out.print(arg2); 

        if (arg3 != null) { 
            for (int i = 0; i < arg3.getLength(); i++) { 
                System.out.print(" " + arg3.getQName(i) + "=\"" + arg3.getValue(i) + "\""); 
            } 
        } 
        System.out.print(">"); 
        super.startElement(arg0, arg1, arg2, arg3); 
    } 

}

Pour plus d'articles liés aux solutions d'utilisation de sax pour analyser le XML en Java, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn