// Validate xml via known dtd ... Eclipse XML Example Invoice ... http://www.roseindia.net/xml/dom/DOMValidateDTD.shtml 
import java.io.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import javax.xml.validation.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;

public class XMLPlusDTDValidate {
	public static void main(String args[]) {	
		try {
			DocumentBuilderFactory fctry = DocumentBuilderFactory.newInstance();
			fctry.setValidating(true);
			DocumentBuilder docbld = fctry.newDocumentBuilder();
			docbld.setErrorHandler(new org.xml.sax.ErrorHandler() {
				// Ignore any fatal errors
				public void fatalError(SAXParseException exception)throws SAXException { }
				// Report on any validation errors 
				public void error(SAXParseException ex)throws SAXParseException {
					System.out.println("Validation problem at " +ex.getLineNumber() + " line.");
					System.out.println(ex.getMessage());
					System.exit(0);
				}
				//Show any warnings
				public void warning(SAXParseException xerr) throws SAXParseException {
					System.out.println(xerr.getMessage());
					System.exit(0);
				}
			});
			Document xmlDoc = docbld.parse(new FileInputStream("Invoice.xml"));
			DOMSource domsource = new DOMSource(xmlDoc);
			StreamResult domresult = new StreamResult(System.out);
			TransformerFactory tfmrfctry = TransformerFactory.newInstance();
			Transformer tfmrfctrymr = tfmrfctry.newTransformer();
			tfmrfctrymr.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "Invoice.dtd");
			tfmrfctrymr.transform(domsource, domresult);
		}
		catch (Exception exx) {
			System.out.println(exx.getMessage());
		}
	}
}