javax.xml.* 패키지의 getFirstChild() 메소드 반환 Element 케스팅 안되는 것 ..

2008/11/28 11:14
크리에이티브 커먼즈 라이선스
Creative Commons License
javax.xml.*패키지에서 xml을 다룰수 있는 api를 제공 한다. xml문서를 읽어서 getFirstChild()메소드를 통해 반환된 내용을 Element로 케스팅하고 Element Object로 사용하려고 할때 문제가 발생했다. 코드는 다음과 같다.

parseObject.java

Exception in thread "main" java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredTextImpl
    at pupustory.test.xml.parseObject.main(parseObject.java:14)

원래 getFirstChild() 가 반환하는 Object의 형태는 Node이다. 따라서 Node가 Element로 케스팅이 되는지 여부를 알아보기 위해 apidoc를 찾아봤다.

org.w3c.dom
Interface Node

All Known Subinterfaces:
Attr, CDATASection, CharacterData, Comment, Document, DocumentFragment, DocumentType, Element, Entity, EntityReference, Notation, ProcessingInstruction, Text

Element가 있다. 그렇다면 케스팅할때 나온 예외는 왜 나온 것 일까 .. 코드는 단순하다. 저기에서 나올만한 에러는 별로 없다. 그렇다면 xml문서에 문제가 있는 것 인가? xml문서는 다음과 같은 구조로 되어있다.



아주 심플하다. 기본적으로 xml 문서 양식을 갖추고 있다. 닫는테그에 문제점도 없고, 루트테그도 있다. 그런데 왜 문제가 발생하지 ..? 문제는 바로 <!DOCTYPE> 테그의 부재다.

사실 저건 벨리데이션 체크를 하지 않을경우(dtd문서가 없을 경우) 생략이 가능하다고 알고 있다. 그런데 이상한건 <!DOCTYPE>를 사용할 경우 문제없이 Element로 케스팅 된다는 것 이다.

여기저기 물어봤더니 .. 해외 포럼에선 이미 많은 사람이 격은 문제로, 별다른 해결책이 없다는 것이 보편적인 대답이라 한다. 따라서 JDOM을 사용하거나 기타 xml파싱 관련 라이브러리(자카르타 젝서스등..)을 사용하라는 것이다.

휴 .. 이거때문에 이틀동안 시간을 허비했다. 사실 처음엔 당연히 내가 잘못한거라 생각했다. 이유는 Element로 케스팅이 안될 이 유가 전혀 없기 때문이다. 아마도 저부분은 조건을 걸어서 throw해주는 부분일듯 한데 .. 여하튼 그문제도 그렇고 .. 만약 <!DOCTYPE> 테그의 부제로 문제가 발생한다면 당연히 parse()메소드에서 예외가 나야하지 않았나.. 하는 생각도 든다.

휴 .. 그냥 라이브러리를 사용하기로 했다 ... 이틀... 시간 너무 아깝다.

저작자 표시 비영리 변경 금지

Pupustory Dev/Java

  1. 이러면서 내공이 쌓이는거 같아요. 누구나 하는 고생이에요 ㅠ

  2. 그렇겠져 .. 점점 발전하는거겠죠 ^^; ...