반응형

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이 공백으로 나올 것이다.

반응형

+ Recent posts