/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package feuille.scripting; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * * @author The Wingate 2940 */ public class XmlSnippetHandler { /* Structure à lire : * <snippetcollection> * <snippet type=""> * <name>Name</name> * <elements> * <element author="" description="" language="">code</element> * <element author="" description="" language="">code</element> * <element author="" description="" language="">code</element> * ... * </elements> * </snippet> * </snippetcollection> */ SnippetHandler sh; public XmlSnippetHandler(String path) throws ParserConfigurationException, SAXException, IOException{ SAXParserFactory fabrique = SAXParserFactory.newInstance(); SAXParser parseur = fabrique.newSAXParser(); File fichier = new File(path); sh = new SnippetHandler(); parseur.parse(fichier, sh); } public List<Snippet> getSnippets(){ return sh.getSnippets(); } public class SnippetHandler extends DefaultHandler{ //résultats de notre parsing private List<Snippet> sniList; private Snippet sni; private SnippetElement se; private String currentType, currentName, currentAuthor, currentDescription, currentLanguage, currentCode, currentElement; //flags nous indiquant la position du parseur private boolean inSnippetColection, inSnippet, inName, inElements, inElement; //buffer nous permettant de récupérer les données private StringBuffer buffer; public SnippetHandler(){ super(); } public List<Snippet> getSnippets(){ return sniList; } //détection d'ouverture de balise @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{ if(qName.equals("snippetcollection")){ sniList = new ArrayList<Snippet>(); inSnippetColection = true; }else{ buffer = new StringBuffer(); if(qName.equals("snippet")){ sni = new Snippet(); currentType = attributes.getValue(0); inSnippet = true; }else if(qName.equals("name")){ inName = true; }else if(qName.equals("elements")){ inElements = true; }else if(qName.equals("element")){ se = new SnippetElement(); currentAuthor = attributes.getValue(0); currentDescription = attributes.getValue(1); currentLanguage = attributes.getValue(2); inElement = true; }else{ //erreur, on peut lever une exception // throw new SAXException("Balise "+qName+" inconnue."); } } } //détection fin de balise @Override public void endElement(String uri, String localName, String qName) throws SAXException{ if(qName.equals("snippetcollection")){ inSnippetColection = false; }else{ if(qName.equals("snippet")){ sni.setType(currentType); sni.setTitle(currentName); sniList.add(sni); buffer = null; inSnippet = false; }else if(qName.equals("name")){ currentName = buffer.toString(); buffer = null; inName = false; }else if(qName.equals("elements")){ buffer = null; inElements = false; }else if(qName.equals("element")){ currentCode = buffer.toString(); buffer = null; se.setAuthor(currentAuthor); se.setDescription(currentDescription); se.setLanguageCode(currentLanguage); se.setCode(currentCode); sni.addSnippetElement(se); inElement = false; }else{ //erreur, on peut lever une exception // throw new SAXException("Balise "+qName+" inconnue."); } } } //détection de caractères @Override public void characters(char[] ch,int start, int length) throws SAXException{ String lecture = new String(ch,start,length); if(buffer != null) { buffer.append(lecture); } } //début du parsing @Override public void startDocument() throws SAXException { // System.out.println("Début du parsing"); } //fin du parsing @Override public void endDocument() throws SAXException { // System.out.println("Fin du parsing"); // System.out.println("Resultats du parsing"); // for(ParticleObject p : lpo){ // System.out.println(p); // } } } }