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