2010년 2월 25일 목요일

XMLBeans에서 parsing할 때 namespace가 지정되지 않았을 때 처리

XMLBeans로 XSD파일을 이용해서 XmlObject를 generation 하여 사용하면
XML 파싱(unmarshalling)과 빌딩(marshalling)에 관한 코드를 별도로 작성할 필요가 없다.

아래와 같이 ant파일을 작성하여 실행하면 xsd 파일에 해당하는 java 클래스를 생성하여 jar파일로 build 된다.




<project name="project" default="xmlobject-generate-jar" basedir=".">

<property environment="env"></property>

<path id="xmlbeans.classpath">
<fileset dir="${env.XMLBEANS_HOME}">
<include name="lib/*.jar">
</include></fileset>
</path>

<taskdef name="xmlbean" classname="org.apache.xmlbeans.impl.tool.XMLBean" classpathref="xmlbeans.classpath">

<target name="xmlobject-generate-jar">
<xmlbean classgendir="gensrc" download="true" javasource="1.5" destfile="ibatis-xmlobject.jar" classpathref="xmlbeans.classpath">
<fileset dir="xsd/ibatis">
<include name="*.xsd">
</include></fileset>
</xmlbean>

<!-- <delete dir="genSrc"><br /> -->
</target>

</taskdef></project>




하지만 이렇게 생성된 클래스파일로 작업을 하게 되면 입력되는 XML 파일이 xsd에서 정의된 namespace로 작성되어 있어야 한다.
namespace가 생략된 채 단순히 태그명(localPart)만으로 작성된 XML 엘리멘트들은 전혀 다른 엘리멘트로 인식하기 때문에 파싱도중 에러가 발생한다.

그래서 네임스페이스가 정의되지도 않고, 네임스페이스 prefix도 포함되어 있지 않은 태그에 대해서는 기본 네임스페이스를 지정해 준 후에 파싱을 해야 한다.



XmlOptions xmlOptions = new XmlOptions();
xmlOptions.setUseDefaultNamespace();
Map namespaces = new HashMap();
namespaces.put("", "http://ibatis.apache.org/dataMapper");
//xmlOptions.setSaveImplicitNamespaces(namespaces); // 저장할 때
xmlOptions.setLoadSubstituteNamespaces(namespaces);

SqlMapConfigDocument document = SqlMapConfigDocument.Factory.parse(inputStream, xmlOptions);




위와 같이 작성하면 기본 네임스페이스가 지정되기 때문에 파싱할 때 정의된 엘리멘트를 찾을 수 없다는 에러가 발생하지 않는다.


Resources
http://xmlbeans.apache.org/
http://www.niclabs.cl/plain/DTE_OpenLibs/src/cl/nic/dte/examples/GeneraFacturaCompleta.java
http://www.niclabs.cl/plain/DTE_OpenLibs/src/cl/nic/dte/examples/GeneraFactura.java

댓글 없음:

댓글 쓰기