1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
|
dans le main par ex :
try {
validation_tree_parser.SaxParser parser = new SaxParser(uri);
parser.doParse(uri);
}catch (Throwable t) {t.printStackTrace();}
puis les classes :
package validation_tree_parser;
import org.xml.sax.DTDHandler;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import java.io.IOException;
import validation_tree_parser.TContentHandler;
import validation_tree_parser.TErrorHandler;
// Proàviudes a simple validating parser to check if an Xhtml file is correct.
public class SaxParser
{
public SaxParser(String uri) {}
public void doParse(String Uri)
{
System.out.println("Analyse du document Xml : " + Uri + "\n\n");
ContentHandler theContentHandler = new TContentHandler();
ErrorHandler theErrorHandler = new TErrorHandler();
DTDHandler theDTDHandler = new TDTDHandler();
try
{
XMLReader theParser= XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
theParser.setContentHandler(theContentHandler);
theParser.setErrorHandler(theErrorHandler);
// voir oci theParser.setDTDHandler();
theParser.setFeature("http://xml.org/sax/features/validation",true);
theParser.setFeature("http://xml.org/sax/features/namespaces",true);
theParser.parse(Uri);
}
catch(IOException ioe)
{System.out.println("Erreur de lecture de l'url : " + ioe.getMessage());}
catch(SAXException se)
{System.out.println("Erreur d'analyse : " + se.getMessage());}
}
}
le content handler :
package validation_tree_parser;
import org.xml.sax.*;
import org.xml.sax.helpers.LocatorImpl;
public class TContentHandler implements ContentHandler
{
private Locator locator;
/**
* Constructeur par defaut.
*/
public TContentHandler()
{
super();
// On definit le locator par defaut.
locator = new LocatorImpl();
}
/**
* Definition du locator qui permet a tout moment pendant l'analyse, de localiser
* le traitement dans le flux. Le locator par defaut indique, par exemple, le numero
* de ligne et le numero de caractere sur la ligne.
* @author smeric
* @param value le locator a utiliser.
* @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
*/
public void setDocumentLocator(Locator value)
{
locator = value;
}
/**
* Evenement envoye au demarrage du parse du flux xml.
* @throws SAXException en cas de probleme quelquonque ne permettant pas de
* se lancer dans l'analyse du document.
* @see org.xml.sax.ContentHandler#startDocument()
*/
public void startDocument() throws SAXException
{
System.out.println("Debut de l'analyse du document");
}
/**
* Evenement envoye a la fin de l'analyse du flux xml.
* @throws SAXException en cas de probleme quelquonque ne permettant pas de
* considerer l'analyse du document comme etant complete.
* @see org.xml.sax.ContentHandler#endDocument()
*/
public void endDocument() throws SAXException
{
System.out.println("Fin de l'analyse du document" );
}
/**
* Debut de traitement dans un espace de nommage.
* @param prefixe utilise pour cet espace de nommage dans cette partie de l'arborescence.
* @param URI de l'espace de nommage.
* @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String)
*/
public void startPrefixMapping(String prefix, String URI) throws SAXException
{
System.out.println("Traitement de l'espace de nommage : " + URI + ", prefixe choisi : " + prefix);
}
/**
* Fin de traitement de l'espace de nommage.
* @param prefixe le prefixe choisi a l'ouverture du traitement de l'espace nommage.
* @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
*/
public void endPrefixMapping(String prefix) throws SAXException
{
System.out.println("Fin de traitement de l'espace de nommage : " + prefix);
}
/**
* Evenement recu a chaque fois que l'analyseur rencontre une balise xml ouvrante.
* @param nameSpaceURI l'url de l'espace de nommage.
* @param localName le nom local de la balise.
* @param rawName nom de la balise en version 1.0 <code>nameSpaceURI + ":" + localName</code>
* @throws SAXException si la balise ne correspond pas a ce qui est attendu,
* comme par exemple non respect d'une dtd.
* @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
public void startElement(String nameSpaceURI, String localName, String rawName, Attributes attributs) throws SAXException {
System.out.println("Ouverture de la balise : " + localName);
if ( ! "".equals(nameSpaceURI)) { // espace de nommage particulier
System.out.println(" appartenant a l'espace de nom : " + nameSpaceURI);
}
System.out.println(" Attributs de la balise : ");
for (int index = 0; index < attributs.getLength(); index++) { // on parcourt la liste des attributs
System.out.println(" - " + attributs.getLocalName(index) + " = " + attributs.getValue(index));
}
}
/**
* Evenement recu a chaque fermeture de balise.
* @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
*/
public void endElement(String nameSpaceURI, String localName, String rawName) throws SAXException
{
System.out.print("Fermeture de la balise : " + localName);
if ( ! "".equals(nameSpaceURI)) { // name space non null
System.out.print("appartenant a l'espace de nommage : " + localName);
}
System.out.println();
}
/**
* Evenement recu a chaque fois que l'analyseur rencontre des caracteres (entre
* deux balises).
* @param ch les caracteres proprement dits.
* @param start le rang du premier caractere a traiter effectivement.
* @param end le rang du dernier caractere a traiter effectivement
* @see org.xml.sax.ContentHandler#characters(char[], int, int)
*/
public void characters(char[] ch, int start, int end) throws SAXException
{
System.out.println("#PCDATA : " + new String(ch, start, end));
}
/**
* Recu chaque fois que des caracteres d'espacement peuvent etre ignores au sens de
* XML. C'est a dire que cet evenement est envoye pour plusieurs espaces se succedant,
* les tabulations, et les retours chariot se succedants ainsi que toute combinaison de ces
* trois types d'occurrence.
* @param ch les caracteres proprement dits.
* @param start le rang du premier caractere a traiter effectivement.
* @param end le rang du dernier caractere a traiter effectivement
* @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
*/
public void ignorableWhitespace(char[] ch, int start, int end) throws SAXException
{
System.out.println("espaces inutiles rencontres : ..." + new String(ch, start, end) + "...");
}
/**
* Rencontre une instruction de fonctionnement.
* @param target la cible de l'instruction de fonctionnement.
* @param data les valeurs associees a cette cible. En general, elle se presente sous la forme
* d'une serie de paires nom/valeur.
* @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String)
*/
public void processingInstruction(String target, String data) throws SAXException
{
System.out.println("Instruction de fonctionnement : " + target);
System.out.println(" dont les arguments sont : " + data);
}
/**
* Recu a chaque fois qu'une balise est evitee dans le traitement a cause d'un
* probleme non bloque par le parser. Pour ma part je ne pense pas que vous
* en ayez besoin dans vos traitements.
* @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
*/
public void skippedEntity(String arg0) throws SAXException
{
// Je ne fais rien, ce qui se passe n'est pas franchement normal.
// Pour eviter cet evenement, le mieux est quand meme de specifier une dtd pour vos
// documents xml et de les faire valider par votre parser.
System.out.println("outrepasse " + arg0);
}
}// ENd Class
et le error handler :
package validation_tree_parser;
import org.xml.sax.*;
/**
* @author PG
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class TErrorHandler implements ErrorHandler
{
/* (non-Javadoc)
* @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
*/
public void error(SAXParseException exception) throws SAXException
{
System.out.println("** Erreur d'analyse ** \n"+
"Ligne : " + exception.getLineNumber()+ " \n " +
"Uri : " + exception.getSystemId() + " \n " +
"Message : " + exception.getMessage());
throw new SAXException("une erreur est survenue");
}
/* (non-Javadoc)
* @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
*/
public void fatalError(SAXParseException exception) throws SAXException
{
System.out.println("** Erreur d'analyse ** \n"+
"Ligne : " + exception.getLineNumber()+ " \n " +
"Uri : " + exception.getSystemId() + " \n " +
"Message : " + exception.getMessage());
throw new SAXException("une erreur fatale est survenue");
}
/* (non-Javadoc)
* @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)
*/
public void warning(SAXParseException exception) throws SAXException
{
System.out.println("** Erreur d'analyse ** \n"+
"Ligne : " + exception.getLineNumber()+ " \n " +
"Uri : " + exception.getSystemId() + " \n " +
"Message : " + exception.getMessage());
throw new SAXException("un avertissement a eu lieu");
}
} |
Partager