Maison >développement back-end >Tutoriel XML/RSS >XML : SAX pour l'analyse XML
Lorsque vous utilisez DOM pour analyser un document XML, vous devez lire l'intégralité du document XML et créer il en mémoire Objet document de l'ensemble de l'arborescence DOM, afin d'exploiter le document XML. Dans ce cas, si le document XML est particulièrement volumineux, il consommera beaucoup de mémoire de l'ordinateur et, dans les cas graves, pourra provoquer un débordement de mémoire.
L'analyse SAX permet de traiter le document lors de sa lecture, sans avoir à attendre que l'intégralité du document soit chargée.
Développer un analyseur SAX en héritant de DefaultHandler
[Note] SAX main Il est utilisé pour analyser les documents XML et ne peut pas modifier, supprimer ou ajouter des éléments.
Sax est un mécanisme push, vous créez un analyseur Sax, l'analyseur vous dira quand il trouvera le contenu dans le document XML (en vous envoyant l'événement, un peu similaire à l'écoute d'événement dans Java Swing). C'est au programmeur de décider quoi faire de ces résultats.
Dans les programmes basés sur Sax, il existe cinq événements Sax les plus couramment utilisés :
1.startDocument()–> indique que votre analyseur commence à numériser le document
2.endDocument()–> vous indique que l'analyseur a trouvé la fin du document
3.startElement()–> vous indique que l'analyseur a trouvé une balise de début. Cet événement vous indique le nom de la balise, tous les noms d'attributs et les valeurs de l'élément
. 4.characters()–> vous indique que l'analyseur a trouvé du texte, vous obtiendrez un tableau de caractères, le décalage du tableau et un décalage de longueur. Avec ces trois variables, vous pouvez obtenir le texte trouvé par l'analyseur
. 5.endElement()–> vous indique que l'analyseur a trouvé une balise de fin. Cet événement vous indique le nom de l'élément
Toujours en utilisant l'exemple XML utilisé dans l'analyse DOM, comme suit :
<?xml version="1.0" encoding="utf-8" standalone="no"?><班级> <学生 地址="香港"> <名字>周小星</名字> <年龄>23</年龄> <介绍>学习刻苦</介绍> </学生> <学生 地址="澳门"> <名字>林晓</名字> <年龄>25</年龄> <介绍>是一个好学生</介绍> </学生></班级>
[Étapes] :
1 Utilisez SAXParserFactory pour créer une analyse SAX. factory
SAXParserFactory spf = SAXParserFactory.newInstance();
2. Obtenez l'objet analyseur via l'usine d'analyse SAX
SAXParser sp = spf.newSAXParser();
3. Associez l'objet d'analyse à l'objet gestionnaire d'événements
sp.parse("src/myClass.xml",new MyHandler());
iciMyHandler
Vous devez le définir vous-même, et il doit hériter de DefaultHandler
, puis réécrire les cinq méthodes d'événements sax mentionnées ci-dessus dans la classe MyHandler
. Bien sûr, vous pouvez également simplement remplacer ce dont vous avez besoin.
Par exemple, le MyHandler
que j'ai écrit maintenant est le suivant :
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); } } }
Le résultat en cours d'exécution est le suivant :
Comme vous Je peux voir, c'est un document XML. Une sorte de traversée, et tout ce que Sax peut faire, c'est traverser.
Donc, si nous avons maintenant une telle exigence : 只显示所有学生的姓名和年龄,不显示学生的介绍,怎么实现呢?
Nous pouvons définir deux variables booléennes isName et isAge dans la classe MyHandler
, identifiez s'il s'agit d'un élément name ou d'un élément age dans la méthode startElement
. Si tel est le cas, obtenez le texte correspondant dans la méthode characters
, comme suit :
1. Définissez deux variables booléennes<.>
private boolean isName = false;private boolean isAge = false;
2. Ajouter un jugement dans la méthode 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. méthode Déterminer s'il faut obtenir le texte 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; }Les résultats en cours sont les suivants :
DefaultHandler
1.1. Mécanisme d'analyse SAX[Note] SAX main Il est utilisé pour analyser les documents XML et ne peut pas modifier, supprimer ou ajouter des éléments.
Dans les programmes basés sur le saxophone, il existe cinq événements de sax les plus couramment utilisés :
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)!