import java.io.*; import org.w3c.dom.*; import org.w3c.dom.html.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.stream.*; import javax.xml.transform.dom.*; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; /** * Testiluokka XML-tiedoston (tai xhml-fragmentin) validointiin. * @author Miika Nurminen / 2003-10-21 */ public class Validator extends org.xml.sax.helpers.DefaultHandler { /** Creates a new instance of Validator */ public Validator() { } /** * Validointi SAX-parserilla (nopea?) */ public void SaxValidate(InputStream is) throws SAXException,ParserConfigurationException,IOException { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); // validointi päälle... SAXParser saxParser = factory.newSAXParser(); saxParser.parse(is,this); } /** * Validointi DOM-parserilla (hitaampi, mutta DOM-puu saadaan käyttöön) */ public Document DomValidate(InputStream is) throws SAXException,ParserConfigurationException,IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); // validointi päälle... DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(this); // virhekäsittely (epävalidi koodi yms...) return builder.parse(is); } //=========================================================== // SAX ErrorHandler methods //=========================================================== // treat validation errors as fatal public void error(SAXParseException err) throws SAXParseException { throw err; /* // oletuskäsittely: System.out.println("** Error" + ", line " + err.getLineNumber() + ", uri " + err.getSystemId()); System.out.println(" " + err.getMessage());*/ } // varoitukset sivuutetaan... public void warning(SAXParseException err) throws SAXParseException { /* System.out.println("** Warning" + ", line " + err.getLineNumber() + ", uri " + err.getSystemId()); System.out.println(" " + err.getMessage());*/ } /** * Validoi tiedoston ja käsittelee virheet */ public static boolean validate(InputStream is) { boolean result=false; try { Validator v = new Validator(); v.SaxValidate(is); //tai: Document doc = v.domValidate(is); return true; } catch (SAXParseException e) { // Validointiin liittyvät virheet (error-metodi heittää poikkeuksen) System.err.println("Invalid document."); System.err.println(e.getMessage()); //(nämä saisi kiinni myös SAXExceptionin kautta, mutta eroteltu tässä) e.printStackTrace(); } catch (SAXException sxe) { // Error generated by this application // (or a parser-initialization error) Exception x = sxe; if (sxe.getException() != null) x = sxe.getException(); System.err.println(x.getMessage()); x.printStackTrace(); } catch (ParserConfigurationException e) { // vikaa parserissa? System.err.println(e.getMessage()); e.printStackTrace(); } catch (IOException e) { // tiedostoa ei saada luettua yms... System.err.println(e.getMessage()); e.printStackTrace(); } return result; } /** * Validoi html 1.0 strict -dokumentin palasen. Olettaa, että pala * on tarkoitettu loogisesti
...
-tagien sisään ja täydentää * puuttuvat osat. */ public static boolean validateDocumentFragment(String data) { StringBuffer s = new StringBuffer(200); s.append(""); s.append(""); s.append(""); s.append(data); s.append("
"); s.append(""); try { byte[] bytes = s.toString().getBytes("UTF-8"); InputStream input = new ByteArrayInputStream(bytes); return validate(input); } catch (UnsupportedEncodingException e) { System.err.println(e.getMessage()); e.printStackTrace(); } return false; } /** * @param args validoitavan tiedoston nimi */ public static void main(String[] args) { try { if (validate(new FileInputStream(new File(args[0])))) System.err.println("Valid."); if (validateDocumentFragment("ei toimi...
")) System.err.println("Valid."); if (validateDocumentFragment("testataan jossain kentässä olevaa tekstiä...")) System.err.println("Valid."); } catch (FileNotFoundException e) { System.err.println(e.getMessage()); e.printStackTrace(); } } }