XML을 변환하여 다른 속성의 결과를 보고자 할 때 보통 StreamSource를 이용하는 것이 일반적인데 이 때 파서가 DTD를 찾게 됩니다. 해당 URL이나 file path에서 DTD를 찾지 못하게 되면 FileNotFoundException을 발생시키게 됩니다.

이것저것 테스트해보다가 가장 효과적인 방법은 입력 소스의 DTD선언부를 없애고 나머지 XML에 대한 변환을 만드는 것입니다. 그렇지 않게 된다면 입력 xml에 대한 것을 개발자가 매번 변경해줘야 한다는 단점이 발생을 합니다.

아래의 메소드를 이용하여 DTD선언부를 comment 처리해버리는 방법을 사용할 수 있습니다.

public static void ignoreDTD(String xmlFileName) {
        try {
            java.io.File fXML = new java.io.File(xmlFileName); 
            java.io.FileReader fr = new java.io.FileReader(fXML);
            long nChars = fXML.length();
            char[] cbuf = new char[(int) nChars];
            int n = fr.read(cbuf);
            String sXML = new String(cbuf); 

            java.util.regex.Pattern p = java.util.regex.Pattern.compile("<!DOCTYPE.*[\n\r]*.*>");
            java.util.regex.Matcher m = p.matcher(sXML);
            boolean bFound = m.find();
            System.out.println(bFound);
            sXML = m.replaceFirst("<!-- " + m.group() + " -->"); // With DOCTYPE commented out,

            System.out.println(sXML);
            fr.close();
        } catch (java.io.FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (java.io.IOException e) {
            System.out.println(e.getMessage());
        }
    }


RegEx 설명
<!DOCTYPE.*[\n\r]*.*>
<!DOCTYPE : <!DOCTYPE 으로 시작하는 문자열이 첫부분임을 선언합니다.
.* : 어떤 문자든 0번 이상 받을 수 있습니다.
[\n\r]* : 다음 라인으로 0번이상 넘어갈 수 있음을 알립니다.
.* : 다음 라인에서 어떤 문자든 받을 수 있습니다.
> : 마지막글자가 ">"로 끝나는 것을 받도록 합니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2009/12/17 14:35 2009/12/17 14:35
http://www.javapattern.info/trackback/319