import java.io.*; import java.util.*; import java.text.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.sax.*; import javax.xml.transform.stream.*; public abstract class SaxUpdate extends XMLFilterImpl { // un filtre SAX public SaxUpdate() throws ParserConfigurationException, SAXException { // on crée le parser SAX SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating( true ); SAXParser saxParser = factory.newSAXParser(); XMLReader parser = saxParser.getXMLReader(); // on branche le filtre sur le parseur super.setParent( parser ); } // on crée un sérialiseur SAX public TransformerHandler getSerializer(String output) throws TransformerConfigurationException { TransformerFactory factory = TransformerFactory.newInstance(); TransformerHandler transformerHandler = ((SAXTransformerFactory) factory).newTransformerHandler(); Result result = new StreamResult( output ); transformerHandler.setResult( result ); return transformerHandler; } static public void main(final String[] args) { try { SaxUpdate saxUpdate = new SaxUpdate() { // concrète implémentation de SaxUpdate // qui cherche les animaux de moins d'un an // et leur ajoute la date de visite médicale private DateFormat DATE_FORMAT = new SimpleDateFormat("y-M-d"); private Calendar TODAY = Calendar.getInstance(); private String DATE_VISITE_MEDICALE = args[2]; public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { int index = atts.getIndex( "date-naissance" ); // sont concernés les éléments qui ont un attribut "date-naissance" if ( index != -1 ) { // on récupère l'attribut String birthDate = atts.getValue( index ); Calendar cal = new GregorianCalendar(); try { cal.setTime( DATE_FORMAT.parse( birthDate ) ); } catch (Exception e) { e.printStackTrace(); } // on ajoute 1 an à la date de naissance pour comparer avec la date du jour cal.add(Calendar.YEAR, 1); if ( cal.after( TODAY ) ) { // l'animal est jeune : on le marque pour la visite médicale AttributesImpl attributes = new AttributesImpl( atts ); attributes.addAttribute( "", "", "visite-médicale", "CDATA", DATE_VISITE_MEDICALE); atts = attributes; } } this.getContentHandler().startElement(uri, localName, qName, atts); } }; // on se branche sur le sérialiseur saxUpdate.setContentHandler( saxUpdate.getSerializer( args[1]) ); // on veut récupérer les erreurs de parsing saxUpdate.setErrorHandler( saxUpdate.getParent().getErrorHandler() ); // on lance le bousin saxUpdate.parse( args[0] ); } catch (Exception e) { System.out.println("Usage :\n SaxUpdate in.xml out.xml date"); e.printStackTrace(); } } }