Heim  >  Artikel  >  Backend-Entwicklung  >  Lösung für die Verwendung von Sax zum Parsen von XML in Java

Lösung für die Verwendung von Sax zum Parsen von XML in Java

高洛峰
高洛峰Original
2017-01-11 12:56:122291Durchsuche

In Java gibt es zwei Möglichkeiten, XML-Dokumente nativ zu analysieren: Dom-Parsing und Sax-Parsing

Dom-Parsing ist leistungsstark und kann hinzugefügt, gelöscht, geändert und überprüft werden. Das XML-Dokument wird behandelt Als Dokumentobjekt während des Betriebs Die Methode wird in den Speicher eingelesen und eignet sich daher für kleine Dokumente

Sax-Parsing liest den Inhalt Zeile für Zeile und Element für Element von Anfang bis Ende. Das Ändern ist umständlicher , aber es ist für große schreibgeschützte Dokumente geeignet

In diesem Artikel wird hauptsächlich das Sax-Parsen erläutert, der Rest wird zurückgelassen

Sax verwendet einen ereignisgesteuerten Ansatz zum Parsen von Dokumenten. Um es einfach auszudrücken: Es ist, als würde man einen Film im Kino ansehen. Man kann ihn von Anfang bis Ende ansehen, ohne zurückzugehen (Dom kann ihn hin und her lesen). Wenn Sie auf eine Verschwörung stoßen, auf einen Riss oder auf eine Schulterreibung, werden Sie Ihr Gehirn und Ihre Nerven mobilisieren, um diese Informationen zu empfangen oder zu verarbeiten. und der Anfang und das Ende des Elements lösen einige Rückrufmethoden aus. Sie können in diesen Rückrufmethoden eine entsprechende Ereignisverarbeitung durchführen

Die vier Methoden sind: startDocument(), endDocument(), startElement(), endElement

Außerdem reicht es nicht aus, zum Knoten zu gehen. Wir benötigen auch die Methode „characters()“, um den im Element enthaltenen Inhalt sorgfältig zu verarbeiten.

Durch das Sammeln dieser Rückrufmethoden wird eine Klasse erstellt wird gebildet, was der Trigger ist, den wir benötigen.

Im Allgemeinen wird das Dokument von der Main-Methode gelesen, aber das Dokument wird im Trigger verarbeitet. Dies ist die sogenannte ereignisgesteuerte Analysemethode

Wie oben gezeigt, beginnen Sie im Trigger zunächst mit dem Lesen des Dokuments und beginnen dann mit dem Parsen der Elemente nacheinander. Der Inhalt jedes Elements wird an die Zeichen zurückgegeben (). Methode

Lösung für die Verwendung von Sax zum Parsen von XML in Java und beenden Sie dann das Lesen der Elemente. Nachdem alle Elemente gelesen wurden, beenden Sie das Parsen des Dokuments

Jetzt beginnen wir mit der Erstellung der Triggerklasse. Um diese Klasse zu erstellen, müssen wir zunächst erben DefaultHandler

zum Erstellen von SaxHandler und Überschreiben der entsprechenden Methode:

XML-Dokument :

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); 
    } 
}
TestDemo-Testklasse:

<?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>
Ausgabeergebnis:

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); 
    } 
}
Obwohl das Obige den Ausführungsprozess korrekt zeigt, ist die Ausgabe sehr chaotisch

Um diesen Prozess klarer auszuführen, können wir SaxHandler auch neu schreiben, um das Original wiederherzustellen XML-Dokument
…………开始解析文档………… 

开始解析元素 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 

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

Umgeschriebene SaxHandler-Klasse:

Weitere Artikel zu Lösungen für die Verwendung von Sax zum Parsen von XML in Java finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn