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
댓글 없음:
댓글 쓰기