달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2007. 2. 22. 17:17

10. XML 문서의 변환과 응용 그거/Tech2007. 2. 22. 17:17

# XML 문서의 변환과 응용

# 문서 변환 방법

1. TrAX(Transformation API for XML)
  XSLT stylesheet를 이용해 문서 변환을 수행

# 데이터의 변환

1. XML의 입력
  TrAX : 여러 형태의 XML 데이터 입력을 처리할 수 있도록 고안됨

  Source interface 구현

  StreamSource source = new StreamSource("events.xml");

2. 변환 결과의 출력
  문서 변환의 결과는 문서 입력의 형식에 따라 여러 가지 형식을 가질 수 있으며,
  이러한 변환 결과의 출력을 위해 Result interface를 이용

  StreamResult result = new StreamResult("transform.html");

3. TransformerFactory
  문서의 변환을 위한 Transformer 객체를 생성하기 전에 TrasnformerFactory class를 이용한다.

  TransformerFactory transFactory = TransformerFactory.newInstance();

4. stylesheet의 선택
  Transformer 객체는 하나의 특정 stylesheet에 기반을 두고 있기 때문에,
  Transformer 객체를 생성하기 전에 문서 변환에 이용할 stylesheet를 지정해야 한다.

  StreamSource style = new StreamSource("style.xml");

  하지만, XML 문서내에 여러 종류의 stylesheet를 이용할 경우 문제가 되기 때문에 다음과 같이 수정한다.

  Source style = transFactory.getAssociatedStylesheet(source, null, null, null);

  getAssociatedStylesheet(StreamSource, media attribute, title attribute, charset attribute)
    : XML 문서 내 XSLT 처리 지시문의 media, title, charset attribute를 기반으로 stylesheet 문서를 선택할 수 있도록 한다.

5. Transformer 객체의 생성과 문서 변환
  TransformerFactory에서 Transformer 객체를 생성할 때는 문서 변환에 필요한 모든 규칙들을 포함하고 있는 stylesheet 문서를 Transformer 객체에 전달해야 한다.
  stylesheet를 지정하지 않을 경우 출력 결과는 입력 XML 문서와 동일한 문서가 된다.

  Transformer trans = transFactory.newTransformer(style);
  trans.transform(source, result);

# template과 parameter
  Templates 객체를 이용하여 여러 파일에 대해 문서 변환 수행시 Transformer를 미리 compile 시켜 두고 사용하면 처리 시간과 성능을 향상시킬 수 있다.

1. template 생성
  TrAX에서 template의 생성은 TransformerFactory와 Transformer 객체의 생성 과정 중간 단계에서 이루어진다.

  Templates template = transFactory.newTemplates(style);
  Transformer trans = template.newTransformer();

  template은 동일한 stylesheet를 이용해서 여러 번 문서 변환을 수행할 때 더 효과적이다.

2. parameter의 이용
  문서 변환 과정을 수행할 때 전달 가능한 값으로, 변환 결과에 영향을 미치게 된다.

  trans.setParameter("optionalChoice", "yes");

3. 다중 파일의 변환
  template과 parameter를 이용해서 여러 XML 파일을 효과적으로 변환하거나 하나의 XML 파일에 대해 여러 번 문서 변환을 수행할 수 있다.

  String outputFileName_opt = "transform_opt.html";
  String outputFileName_mand = "transform_mand.html";

  StreamResult result_opt = new StreamResult(outputFileName_opt);
  StreamResult result_mand = new StreamResult(outputFileName_mand);

  ...

  trans.setParameter("optionalChoice", "yes");
  trans.transform(source, result_opt);

  trans.setParameter("optionalChoice", "no");
  trans.transform(source, result_mand);

# 문서 변환과 SAX
  TrAX에서 SAX를 이용할 경우 추가적으로 고려해야 할 사항들
  - TrAX를 사용하기 전에 SAXSources와 SAXResults를 이용한다.
  - 문서 변환을 수행할 ContentsHandler를 작성하고, 이를 통해 입력 XML 문서를 파싱한다.
  - 문서 변환에 XMLFilters 객체를 사용할 수도 있다.

1. SAX 입력
  SAX 이벤트에 대한 소스를 생성하고 이를 문서 변환을 위한 입력으로 이용하기 위해 SAXSource 객체를 지정한다.

  XMLReader reader = XMLReaderFactory.createXMLReader();
  SAXSource source = new SAXSource(reader, new InputSource("inputFile.xml"));

  StreamResult result = new StreamResult("outputFile.xml");

  TransformerFactory transFactory = TransformerFactory.newInstance();
  Source style = transFactory.getAssociatedStylesheet(source, null, null, null);
  Transformer trans = transFactory.newTransformer(style);

  trans.transfor(source, result);

  입력 문서의 유효성 검증은 다음과 같이 가능하다.

  String featureId = "http://www.xml.org/sax/features/validation";
  reader.setFeature(featureId, true);

2. Transformer를 ContentsHandler로 이용
  Transformer를 Contentshandler로 명시적으로 선언

  StreamResult result = new StreamResult("outputFile.xml");

  TransformerFactory transFactory = TransformerFactory.newInstance();
  SAXTransformerFactory saxTransFactory = (SAXTransformerFactory)transFactory;

  TransformerHander trans = saxTransFactory.newTransformerHandler(style);
  trans.setResult(result);

  XMLReader reader = XMLReaderFactory.createXMLReader();

  reader.setContentHandler(trans);

3. SAX 출력
  문서 변환의 결과로 출력되는 SAX 스트림이 의미를 가지도록 하기 위해서는 이 SAX 스트림을 ContentsHandler에 전달해야 한다.

4. 연속된 문서 변환
 
  한 문서 변환 과정의 결과가 다른 문서 변환 과정의 입력으로 처리 되는 식의 연속된 처리 과정

  StreamSource style1 = new StreamSource("votes1.xsl");
  StreamSource style2 = new StreamSource("votes2.xsl");

  StreamResult result = new StreamResult("output.xml");

  TransformerFactory transFactory = TransformerFactory.newInstance();

  SAXTransformerFactory saxTransFactory = (SAXTransformerFactory)transFactory;

  TransformerHandler trans1 = saxTransFactory.newTransformerHandler(style1);
  TransformerHandler trans2 = saxTransFactory.newTransformerHandler(style2);

  trans1.setResult(new SAXResult(trans2));  // trans1에 대한 출력을 SAXResult로 trans2에 전달
  trans2.setResult(result);                 // trans2에 대한 출력을 result로 출력

  XMLReader reader = XMLReaderFactory.createXMLReader();
  reader.setContentHandler(trans1);
  reader.parse("xmlfile.xml");

5. SAX와 XMLFilter
  XMLFilter를 이용하여 연속된 문서 변환을 수행할 수도 있다.

  XMLFilter trans1 = saxTransFactory.newXMLFilter(style1);
  XMLFilter trans2 = saxTransFactory.newXMLFilter(style2)'

  TransformerHandler output = saxTransFactory.newTransformerHandler();
  output.setResult(result);

  trans1.setParent(reader);
  trans2.setParent(trans1);
  trans2.setContentHandler(output);

  trans2.parse("output.xml");

# stylesheet 문서 내에서의 프로그래밍

  stylesheet 문서 내에서 확장 함수나 element들을 생성할 수 있는 방법을 정의하고 있다.

1. 확장함수
  사용자 정의 함수를 이용하기 위해서는 새로운 namespace를 생성하여 XSLT 변환 엔진이 새로 정의된 함수를 인식할 수 있도록 해야 한다.

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  xmlns:lxslt="http://xml.apache.org/xslt"
      xmlns:results="http://www.example.com/results"
      extension-element-prefixes="results"
      version="1.0">
  <lxslt:component prefix="results" functions="addVote, getResults">
 <lxslt:script lang="javascript">
      var sparkle, dregraal;

   sparkle = 0;
   dregraal = 0;

   function addVote(thisVote) {
     if( thisVote.equals("Sparkle") ) {
     sparkle++;
     } else {
       dregraal++;
     }
     return null;
   }

   function getResults() {
     return "Sparkle : " + sparkle + " Dregraal : " + dregraal;
   }
    </lxslt:script>
  </lxslt:component>

'그거 > Tech' 카테고리의 다른 글

구조적 VS 객체지향적  (0) 2007.02.27
자바서비스넷의 기술자료 링크  (0) 2007.02.23
09. XSLT(eXtensible Stylesheet Language Transformations)  (0) 2007.02.20
08.XML Schema  (0) 2007.02.16
07.DTD(Document Type Definition)  (0) 2007.02.15
:
Posted by 뽀기