Heim  >  Artikel  >  Backend-Entwicklung  >  XML – SAX für XML-Parsing

XML – SAX für XML-Parsing

黄舟
黄舟Original
2017-02-24 15:06:591386Durchsuche

1. SAX-Analyse

  • Wenn Sie DOM zum Parsen eines XML-Dokuments verwenden, müssen Sie das gesamte XML-Dokument lesen und erstellen Es speichert das Dokumentobjekt des gesamten DOM-Baums, um das XML-Dokument zu bearbeiten. Wenn das XML-Dokument in diesem Fall besonders groß ist, verbraucht es viel Computerspeicher und kann in schweren Fällen sogar zu einem Speicherüberlauf führen.

  • SAX-Parsing ermöglicht die Verarbeitung des Dokuments beim Lesen des Dokuments, ohne warten zu müssen, bis das gesamte Dokument geladen ist.

  • Entwickeln Sie einen SAX-Parser durch Vererbung DefaultHandler

[Hinweis] SAX main Es wird verwendet zum Parsen von XML-Dokumenten und kann keine Elemente ändern, löschen oder hinzufügen.

1.1. SAX-Parsing-Mechanismus

Sax ist ein Push-Mechanismus, Sie erstellen einen Sax-Parser, Der Parser teilt Ihnen mit, wenn er den Inhalt im XML-Dokument findet (indem er das Ereignis an Sie weiterleitet, ähnlich wie beim Abhören von Ereignissen in Java Swing). Es ist Sache des Programmierers, zu entscheiden, was mit diesen Erkenntnissen geschehen soll.

In Saxofon-basierten Programmen gibt es fünf am häufigsten verwendete Saxofon-Ereignisse:

1.startDocument()–> teilt Ihrem Parser mit, dass er mit dem Scannen des Dokuments
beginnt 2.endDocument()–> teilt Ihnen mit, dass der Parser das Ende des Dokuments
gefunden hat 3.startElement()–> teilt Ihnen mit, dass der Parser ein Start-Tag gefunden hat. Dieses Ereignis teilt Ihnen den Namen des Tags, alle Attributnamen und Werte des Elements
mit 4.characters()–> sagt Ihnen, dass der Parser Text gefunden hat. Sie erhalten ein Zeichenarray, den Offset des Arrays und einen Längenoffset. Mit diesen drei Variablen können Sie den vom Parser gefundenen Text abrufen 5.endElement()–> teilt Ihnen mit, dass der Parser ein End-Tag gefunden hat

1.2 SAX-Parsing-Beispiel

Verwenden Sie weiterhin das beim DOM-Parsing verwendete XML-Beispiel wie folgt:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>

[Schritte]:

1. Verwenden Sie SAXParserFactory, um ein SAX-Parsing zu erstellen Factory

SAXParserFactory spf = SAXParserFactory.newInstance();
2. Holen Sie sich das Parser-Objekt über die SAX-Parsing-Factory

SAXParser sp = spf.newSAXParser();
3. Verknüpfen Sie das Parser-Objekt mit dem Event-Handler-Objekt

sp.parse("src/myClass.xml",new MyHandler());
Hier

Sie müssen es selbst definieren, es muss MyHandler erben und dann die fünf oben genannten Sax-Ereignismethoden in der Klasse DefaultHandler neu schreiben. Natürlich können Sie auch einfach das überschreiben, was Sie benötigen. MyHandlerZum Beispiel lautet das
, das ich jetzt geschrieben habe, wie folgt: MyHandler

class MyHandler extends DefaultHandler{    /**
     * 发现文档开始,该函数只会被调用一次
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("startDocument");
    }    /**
     * 发现文档结束,该函数只会被调用一次
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("endDocument");
    }    /**
     * 发现XML中的一个元素开始,会被反复调用
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("元素名称:"+qName);
    }    /**
     * 发现XML中的一个元素结束,会被反复调用
     */
    @Override
    public void endElement(String uri, String localName, String qName)            
    throws SAXException {

    }    /**
     * 发现XML文件中的文本,会被反复调用
     */
    @Override
    public void characters(char[] ch, int start, int length)            
    throws SAXException {        // 显示文本内容
        String text = new String(ch,start,length);        if(!text.trim().equals("")){
            System.out.println(text);
        }
    }
}
Das laufende Ergebnis lautet wie folgt:

XML – SAX für XML-Parsing

Wie Sie Sie können sehen, dass dies ein XML-Dokument ist. Eine Art Durchquerung, und alles, was Sax tun kann, ist Durchqueren.


Wenn wir jetzt also eine solche Anforderung haben:

只显示所有学生的姓名和年龄,不显示学生的介绍,怎么实现呢?

Wir können zwei boolesche Variablen isName und isAge in der Klasse

definieren. Identifizieren Sie, ob es sich um ein Namenselement oder ein Alterselement in der MyHandler-Methode handelt. Wenn ja, rufen Sie den entsprechenden Text in der startElement-Methode wie folgt ab: characters

Definieren Sie zwei boolesche Variablen

private boolean isName = false;private boolean isAge = false;

2. Urteil in der -Methode hinzufügen startElement

@Overridepublic void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        this.isName = true;
    }else if(qName.equals("年龄")){        this.isAge = true;
    }
}

3 Methode Bestimmen Sie, ob der Text characters

erhalten werden soll. Denken Sie abschließend daran, die beiden booleschen Variablen auf „false“ zurückzusetzen.
@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 显示文本内容
    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){
        System.out.println(text);
    }
    isName = false;
    isAge = false;
}
Die laufenden Ergebnisse sind wie folgt:


XML – SAX für XML-Parsing

1. SAX-Analyse

    Verwenden von DOM to XML-Dokumente analysieren Dabei müssen Sie das gesamte XML-Dokument lesen, das Document-Objekt des gesamten DOM-Baums im Speicher erstellen und dann das XML-Dokument bearbeiten. Wenn das XML-Dokument in diesem Fall besonders groß ist, verbraucht es viel Computerspeicher und kann in schweren Fällen zu einem Speicherüberlauf führen.
  • SAX-Parsing ermöglicht die Verarbeitung des Dokuments beim Lesen des Dokuments, ohne warten zu müssen, bis das gesamte Dokument geladen ist.
  • Entwickeln Sie einen SAX-Parser durch Vererbung
  • DefaultHandler

[Hinweis] SAX main Es wird verwendet zum Parsen von XML-Dokumenten und kann keine Elemente ändern, löschen oder hinzufügen.

1.1. SAX-Parsing-Mechanismus

Sax ist ein Push-Mechanismus, Sie erstellen einen Sax-Parser, der Ihnen sagt, wann Es findet den Inhalt im XML-Dokument (und sendet das Ereignis an Sie weiter, ähnlich wie das Abhören von Ereignissen in Java Swing). Es ist Sache des Programmierers, zu entscheiden, was mit diesen Erkenntnissen geschehen soll.

In Saxophon-basierten Programmen gibt es fünf am häufigsten verwendete Saxophon-Events:

1.startDocument()–>告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档
 2.endDocument()–>告诉你解析器发现了文档结尾
 3.startElement()–>告诉你解析器发现了一个起始标签,该事件告诉你标签的名称、该元素所有的属性名和值
 4.characters()–>告诉你解析器发现了一些文本,将得到一个字符数组,该数组的偏移量和一个长度偏移量,有这三个变量你可以得到解析器发现的文本
 5.endElement()–>告诉你解析器发现了一个结束标签,该事件告诉你元素的名称

1.2.SAX解析实例

依然使用DOM解析中用到的XML例子,如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>

【步骤】:

1.使用SAXParserFactory创建SAX解析工厂

SAXParserFactory spf = SAXParserFactory.newInstance();

2.通过SAX解析工厂得到解析器对象

SAXParser sp = spf.newSAXParser();

3.将解析对象和事件处理器对象关联

sp.parse("src/myClass.xml",new MyHandler());

这里的MyHandler需要自己定义,并且它要继承DefaultHandler,然后在MyHandler类中重写上文提到的5个sax事件方法,当然也可以只重写自己需要的。
比如现在我写的MyHandler如下:

class MyHandler extends DefaultHandler{    /**
     * 发现文档开始,该函数只会被调用一次
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("startDocument");
    }    /**
     * 发现文档结束,该函数只会被调用一次
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("endDocument");
    }    /**
     * 发现XML中的一个元素开始,会被反复调用
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("元素名称:"+qName);
    }    /**
     * 发现XML中的一个元素结束,会被反复调用
     */
    @Override
    public void endElement(String uri, String localName, String qName)            
    throws SAXException {

    }    /**
     * 发现XML文件中的文本,会被反复调用
     */
    @Override
    public void characters(char[] ch, int start, int length)            
    throws SAXException {        // 显示文本内容
        String text = new String(ch,start,length);        
        if(!text.trim().equals("")){
            System.out.println(text);
        }
    }
}

运行结果如下:

XML – SAX für XML-Parsing

可以看到,这是对XML文档的一种遍历,而sax能够做的也只是遍历了。


那么,如果现在我们有这样一个需求:只显示所有学生的姓名和年龄,不显示学生的介绍,怎么实现呢?

我们可以在MyHandler类中定义两个布尔变量isName和isAge,在startElement方法中标识是否是姓名元素或者年龄元素,如果是的话才在characters方法中获取对应的文本,如下:

1.定义两个布尔变量

private boolean isName = false;private boolean isAge = false;

2.在startElement方法中添加判断

@Overridepublic void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        
        this.isName = true;
    }else if(qName.equals("年龄")){        this.isAge = true;
    }
}

3.在characters方法中根据标识符进行判断是否获取文本

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 显示文本内容
    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){
        System.out.println(text);
    }
    isName = false;
    isAge = false;
}

最后要记得将两个布尔变量复位成false。
运行结果如下:

XML – SAX für XML-Parsing

 以上就是XML—XML解析之SAX的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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
Vorheriger Artikel:XML – DOM für XML-ParsingNächster Artikel:XML – DOM für XML-Parsing