IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  자바 | XML | 오픈 소스  >

JiBX 1.2, Part 1: Java 코드를 XML 스키마로 변환

Java 데이터 모델 및 XML 문서 간 사용자 정의 변환을 통한 스키마 퀄리티 향상

developerWorks
Go to the previous page11 페이지 중 4 페이지Go to the next page

문서 옵션
PDF format - Fits A4 and Letter

PDF - Fits A4 and Letter
188 KB (29 pages)

Get Adobe® Reader®

샘플 코드


제안 및 의견
피드백

튜토리얼 평가

이 컨텐츠를 개선하기 위한 도움을 주십시오.


XML 문서 작업

이 섹션에서는 JiBX 바인딩 컴파일러를 실행하는 방법과 런타임에 JiBX를 사용하여 XML 문서 작업을 수행하는 방법에 대해 설명한다.

JiBX 바인딩 컴파일러 실행

생성된 바인딩 정의를 XML 문서 작업에 사용하려면 먼저 JiBX 바인딩 컴파일러 도구를 실행해야 한다. 바인딩 컴파일러는 바인딩 정의에 지정된 대로 XML과의 상호 변환 기능을 실제로 구현한 바이트 코드를 컴파일된 클래스 파일에 추가한다. Java 클래스를 다시 컴파일하거나 바인딩 정의를 수정할 때마다 바인딩 컴파일러를 실행하여 바인딩 컴파일러 단계를 프로젝트의 표준 프로세스에 추가해야 한다.

바인딩 컴파일러는 JiBX 배포판의 jibx-bind.jar에 있다. JiBX 문서에서는 빌드 프로세스의 일부가 아닌 런타임에 바인딩 컴파일러를 실행하는 방법을 비롯하여 여러 가지 실행 방법에 대해 자세히 설명한다. JiBX는 Eclipse 및 IntelliJ IDEA와 같은 IDE에서 작업할 때 바인딩 컴파일러를 자동으로 실행하는 Eclipse 및 IntelliJ IDEA용 플러그인도 제공한다.

이 튜토리얼에서는 편의상 Ant에서 build.xml의 bind 대상을 사용하여 바인딩 컴파일러를 실행한다. 그림 2에서는 이 대상을 실행할 경우 표시되는 출력을 보여 준다. 여기에서는 compilebindgen 대상을 이미 실행한 것으로 가정한다. (ant compile bindgen bind와 같이 명령행에 차례대로 입력하여 세 대상을 차례대로 실행할 수도 있다.)


그림 2. Ant build bind 태스크
바인딩 컴파일러에 대한 Ant build 출력



위로


런타임에 JiBX 사용

Listing 3에서는 생성된 스키마와 일치하는지 비교하는 간단한 테스트 문서를 보여 주며, 이 문서는 튜토리얼의 코드 다운로드에 data.xml로 포함되어 있다.


Listing 3. 기본 바인딩 테스트 문서
<order orderNumber="12345678" orderDate="2008-10-18" shipDate="2008-10-22"
    xmlns="http://jibx.org/starter">
  <customer customerNumber="5678">
    <firstName>John</firstName>
    <lastName>Smith</lastName>
  </customer>
  <billTo>
    <street1>12345 Happy Lane</street1>
    <city>Plunk</city>
    <state>WA</state>
    <postCode>98059</postCode>
    <country>USA</country>
  </billTo>
  <shipping>PRIORITY_MAIL</shipping>
  <shipTo>
    <street1>333 River Avenue</street1>
    <city>Kirkland</city>
    <state>WA</state>
    <postCode>98034</postCode>
    <country>USA</country>
  </shipTo>
  <item quantity="1" price="5.99">
    <id>AC4983498512</id>
    <description>Left-handed widget</description>
  </item>
  <item quantity="2" price="9.50">
    <id>IW2349050499</id>
    <description>Right-handed widget</description>
  </item>
  <item quantity="1" price="8.95">
    <id>RC3000488209</id>
    <description>High-speed MP3 rewinder</description>
  </item>
</order>

다운로드 패키지에는 Listing 4와 같이 JiBX를 사용하여 문서를 마샬링언마샬링하는 방법을 보여 주는 간단한 테스트 프로그램도 있다. (마샬링은 원래 오브젝트에서 연결된 오브젝트를 포함하여 메모리에 있는 오브젝트에 대한 XML 표현을 생성하는 프로세스이며, 언마샬링은 XML 표현을 기반으로 메모리에 오브젝트(및 연결된 오브젝트 그래프)를 빌드하여 마샬링을 역으로 수행하는 프로세스이다.) Ant run 대상은 Listing 3 문서를 입력으로 사용하여 이 테스트 프로그램을 실행하며 결과적으로 마샬링된 문서 사본이 out.xml 파일로 작성된다.


Listing 4. 테스트 프로그램
public class Test
{
    /**
     * Unmarshal the sample document from a file, compute and set order total, then
     * marshal it back out to another file.
     * 
     * @param args 
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("Usage: java -cp ... " +
                "org.jibx.starter.Test in-file out-file");
            System.exit(0);
        }
        try {
            
            // unmarshal customer information from file
            IBindingFactory bfact = BindingDirectory.getFactory(Order.class);
            IUnmarshallingContext uctx = bfact.createUnmarshallingContext();
            FileInputStream in = new FileInputStream(args[0]);
            Order order = (Order)uctx.unmarshalDocument(in, null);
            
            // compute the total amount of the order
            float total = 0.0f;
            for (Iterator<Item> iter = order.getItems().iterator(); iter.hasNext();) {
                Item item = iter.next();
                total += item.getPrice() * item.getQuantity();
            }
            order.setTotal(new Float(total));
            
            // marshal object back out to file (with nice indentation, as UTF-8)
            IMarshallingContext mctx = bfact.createMarshallingContext();
            mctx.setIndent(2);
            FileOutputStream out = new FileOutputStream(args[1]);
            mctx.setOutput(out, null);
            mctx.marshalDocument(order);
            System.out.println("Processed order with " +  order.getItems().size() +
                " items and total value " + total);
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (JiBXException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}

그림 3에서는 run 대상을 실행할 때 표시되는 출력을 보여 준다.


그림 3. Ant build run 태스크
테스트 프로그램을 실행한 Ant build 출력

생성된 out.xml 파일과 Listing 3의 원래 입력을 비교해 보면, 네임스페이스 선언 및 속성 순서가 다르고 테스트 프로그램에서 계산되어 설정된 total 속성이 출력에 추가되어 있다는 점을 제외하면 두 문서가 동일하다는 것을 알 수 있다. 그러나 항상 이러한 결과를 얻을 수 있는 것은 아니다. 대부분의 데이터 바인딩 형식과 마찬가지로 JiBX는 문서의 "중요" 데이터 즉, 애플리케이션에서 사용하고 있는 값에 대해서만 작동한다. 시작 또는 종료 태그 내의 공백과 같이 문서에서 중요하지 않은 부분은 문서를 언마샬링할 때 유실된다. 이처럼 입력 및 출력 문서가 매우 유사한 이유는 Listing 4 코드에서 입력 문서와 동일하게 요소 중첩 레벨 당 두 칸씩 들여쓰도록 출력 형식을 설정했기 때문이다.

자세히 살펴보면 Listing 5에 표시된 출력 문서의 항목 목록 부분이 입력의 해당 부분과 다르다는 것을 알 수 있다. 그리고 이 차이점이 중요하게 느껴질 수도 있을 것이다.


Listing 5. 출력 문서의 항목 목록
<item quantity="1" price="5.99">
    <id>AC4983498512</id>
    <description>Left-handed widget</description>
  </item>
  <item quantity="2" price="9.5">
    <id>IW2349050499</id>
    <description>Right-handed widget</description>
  </item>
  <item quantity="1" price="8.95">
    <id>RC3000488209</id>
    <description>High-speed MP3 rewinder</description>
  </item>

Listing 5에서 굵게 표시된 행과 Listing 3에 있는 원래 문서의 해당 행을 비교하면 가격이 9.50에서 9.5로 변경되면서 뒤에 있는 0이 제거되었다는 것을 알 수 있다. 그렇지만 이는 오류가 아니다. 가격 값에 사용되는 표현은 float이며, Java 및 XML 스키마에서는 float의 경우 소수점 앞에 오는 0과 소수점 뒤에 오는 0이 중요하지 않다.




위로



Go to the previous page11 페이지 중 4 페이지Go to the next page
    IBM 소개 개인정보 보호정책 문의