XHTML Validation
21 January 2005
I've added the first new and interesting feature to my weblog in a while: it validates articles I post and edit for XHTML 1.0 Transitional compliance.
Here's a bit of the code that does it:
/** * validate the input String to be proper XHTML 1.0 Transitional. * @author John M Flinchbaugh */ public class XmlValidator extends DefaultHandler { private String errorMessage = null; /** * validate input and return the message. null means good. * @param in input xhtml string * @return parser message. null means it passed. * @throws SAXException exception from SAXParser * @throws ParserConfigurationException exception from * SAXParserFactory */ public String validate(String in) throws SAXException, ParserConfigurationException { errorMessage = null; StringBuffer sb = new StringBuffer(); // wrap article string in context HTML sb.append("<!DOCTYPE html" + " PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"" + " \"http://www.w3.org/TR/xhtml1/DTD/" + "xhtml1-transitional.dtd\">" + "<html><head><title>test</title></head><body><div>"); sb.append(in); sb.append("</div></body></html>"); InputSource source = new InputSource( new StringReader(sb.toString())); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); SAXParser parser = factory.newSAXParser(); try { parser.parse(source, this); } catch (IOException ignored) { // won't happen, because this is a StringReader } catch (SAXParseException parseEx) { errorMessage = parseEx.getMessage(); } return errorMessage; } /** * error method from DefaultHandler. * saves the error message to returned by validate() method * @param e parse exception */ public void error(SAXParseException e) throws SAXParseException { errorMessage = e.getMessage(); } }
(It wouldn't even let me post this message, until I cleaned up the embedded HTML in the code.)