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
.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 !