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.
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
<?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();
SAXParser sp = spf.newSAXParser();
sp.parse("src/myClass.xml",new MyHandler());
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. MyHandler
Zum 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); } } }
只显示所有学生的姓名和年龄,不显示学生的介绍,怎么实现呢?
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
@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; }
DefaultHandler
1.1. SAX-Parsing-Mechanismus[Hinweis] SAX main Es wird verwendet zum Parsen von XML-Dokumenten und kann keine Elemente ändern, löschen oder hinzufügen.
In Saxophon-basierten Programmen gibt es fünf am häufigsten verwendete Saxophon-Events:
1.startDocument()–>告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档
2.endDocument()–>告诉你解析器发现了文档结尾
3.startElement()–>告诉你解析器发现了一个起始标签,该事件告诉你标签的名称、该元素所有的属性名和值
4.characters()–>告诉你解析器发现了一些文本,将得到一个字符数组,该数组的偏移量和一个长度偏移量,有这三个变量你可以得到解析器发现的文本
5.endElement()–>告诉你解析器发现了一个结束标签,该事件告诉你元素的名称
依然使用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能够做的也只是遍历了。
那么,如果现在我们有这样一个需求:只显示所有学生的姓名和年龄,不显示学生的介绍,怎么实现呢?
我们可以在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—XML解析之SAX的内容,更多相关内容请关注PHP中文网(www.php.cn)!