DTD를 기준으로 validation을 할때 사용하는 소스이다.
참조: http://www.roseindia.net/xml/dom/DOMValidateDTD.shtml
import java.io.FileInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
public class DOMValidateDTD {
public static void main(String args[]) {
String msg=null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setErrorHandler(new org.xml.sax.ErrorHandler() {
// Ignore the fatal errors
public void fatalError(SAXParseException exception)
throws SAXException {
}
// Validation errors
public void error(SAXParseException e) throws SAXParseException {
System.out.println(e.getMessage());
}
// Show warnings
public void warning(SAXParseException err)
throws SAXParseException {
System.out.println(err.getMessage());
}
});
builder.setEntityResolver(new DTDResolver());
Document xmlDocument = builder.parse(new FileInputStream(
"Test.xml"));
DOMSource source = new DOMSource(xmlDocument);
StreamResult result = new StreamResult(System.out);
StreamResult result = new StreamResult(System.out);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "");
transformer.transform(source, result);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
1. builder.setEntityResolver(new DTDResolver());
- 외부 dtd가 있는 경우 그것을 참조하게 설정해 주는 DTDResolver라는 EntityResolver를 상속받는 클래스를 구현한 것이다.
2. builder.setErrorHandler(new org.xml.sax.ErrorHandler()
- 파싱중에 발생하는 에러를 처리하는 부분이다.
ㄱ. warning - 오류취급 하지 않지만 사용자에게 전달해야 할때
ㄴ. error - xml 1.0권고안 오류, 파서 더이상 실행하지 않음.
ㄷ. fatal error - 오류로 인해 파서의 계속적 수행불가 (태그 열리고 닫히는 것)
3. Document xmlDocument = builder.parse(new FileInputStream("TEST.xml"));
xml문서를 파싱하는 부분이다.
4. DOMSource source = new DOMSource(xmlDocument);
StreamResult result = new StreamResult(System.out);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
"");
파싱한 문서를 다시 Transformer객체를 이용해서 xml문서를 생성해 주는 부분이다.
setOutputProperty를 사용하여 만들고자 하는 xml을 원하는 값으로 넣어준다.
위와같이 transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, ""); 로 한다면
만들어진 xml확인시 DOCTYPE이 공백으로 나올 것이다.