반응형
출처: http://kr.blog.yahoo.com/kwon37xi/folder/3381246.html

JDOM은 XML 문서를 트리 구조로 구성한다는 점에서 DOM과 유사하다. 그러나 JDOM은 오직 Java만 지원한다.
JDOM은 DOM이 아니며 내부적으로 DOM을 확장하지도 않았다.

기본적으로 알아야 할 것

JDOM에는 DOM의 Node와 같은 트리 구조를 위한 상위 인터페이스가 존재하지 않는다. 요소(Element)와 속성(Attribute) 등 모든 것이 콘크리트 클래스(concrete class; 일반적인 인터페이스와 abstract 클래스를 제외한 클래스를 뜻한다. 또한 직접적으로 객체를 생성할 수 있는 클래스를 콘크리트 클래스라고 한다)로 이루어져 있다.

  • Element 클래스에 getText()가 있어 요소의 컨텐트를 구할 수 있다.
  • NodeListNamedNodeMap 같은 리스트 클래스가 없이 Java 컬렉션 API(java.util.List 등)을 사용한다.
  • Element.getAttributes() 로 속성의 List를 얻을 수 있다.

JDOM Document 생성하기

XML 원시 데이타가 없는 상태에서 JDOM Document 객체를 생성하려면 우선 JDOM의 Element 클래스를 사용해 XML 문서의 루트 요소를 생성하고, Element 클래스를 Document 클래스 생성자에 인자로 전달하여 Document 인스턴스를 생성하면 된다.
Element rootElement = new Element("root"); // "root"는 Root 요소
Document document = new Document(rootElement); // 새로운 Document 생성

입력과 출력

JDOM은 파서가 아니다. JDOM은 XML 원본을 읽기 위해 다른 파서에 의존한다. 또한 JDOM은 SAX 이벤트, DOM 트리, JDBC의 ResultSet 등을 입력 받는다.
  • 입력 스트림, 파일, 디스크상의 문서를 사용하거나 또는 기존의 XML을 DOM 트리로 생성할 필요가 없는 경우에는 SAXBuilder를 사용하는 것이 좋다.

    SAXBuilder builder = new SAXBuilder();
    Document doc = builder.build(new FileInputStream("contents.xml"));
    
  • DOM 빌더는 이미 DOM 트리 구조로 되어 있는 것을 JDOM 으로 바꿀 때만 사용한다. 성능이 SAXBuilder에 비해 떨어지므로 DOM 트리가 아닌 스트림에서 XML 데이터를 읽어 파싱할 때는 SAXBuilder를 사용한다.

    DOMBuilder builder = new DOMBuilder();
    
    // myDomDocumentObject는 DOM의 Document 객체이다.
    Document doc = builder.build(myDomDocumentObject);
    
    위는 org.w3c.dom.Documentorg.jdom.Document로 전환한다.
  • JDOM의 구조를 DOM 트리로 바꾸려면 DOMOutputter 클래스를 사용한다.

    DOMOutputter outputter = new DOMOutputter();
    org.w3c.dom.Document domDoc = outputter.output(myJDOMDocumentObject);
    
  • JDOM의 구조를 이용해 SAX 이벤트를 처리하려면

    SAXOutputter outputter = new SAXOutputter();
    outputter.setContentHandler(myContentHandler);
    outputter.setErrorHandler(myErrorHandler);
    outputter.output(myJDOMDocumentObject);
    
    SAXOutputter는 XML 문서가 아닌 JDOM Document를 분석하여 SAX 이벤트를 발생시키는 SAXReader라고 생각하면 된다.
  • XMLOutputter는 XML 문서를 Stream이나 Writer, 파일 또는 변환하려는 다른 구조 등으로 출력한다.

    XMLOutputter outputter = new XMLOutputter(org.jdom.output.Format.getPrettyFormat());
    outputter.output(jdomDocumentObject, new FileOutputStream("result.xml"));
    
    org.jdom.output.Format 객체를 이용해 출력 형식을 결성할 수 있으며 Format.getPrettyFormat()은 잘 정렬된 기본적인 XML 출력 형식을 지정한다.
  • XMLOutputter는 책에서 설명한 JDOM 버전과 현재 1.0 버전의 사용법이 다르다. 여기서 설명한 것은 1.0 기준이다.

요소, 속성 등을 추가하기

  • Element의 내용은 Element.setText(String)으로 추가한다.

    // <ClassName>org.jdom.Element</ClassName>
    Element element = new Element("ClassName");
    element.setText("org.jdom.Element");
    
  • Element나 그 외의 JDOM에 적합한 모든 구성 요소는 요소의 addContent() 메소드에 의해 추가될 수 있다. 추가 될 수 있는 타입으로는 Element, Attribute, Entity, Comment, ProcessingInstruction 등이 있다.

자식 노드 얻기

  • Element.getChild("요소이름")로 요소에서 "요소이름"의 자식 요소 첫번째를 얻을 수 있다. 자식 요소가 없으면 null을 리턴한다.
  • Element.getChildren()은 현재 요소의 자식 요소 List를 리턴한다.
  • Element.getChildren("요소이름")은 현재 요소의 "요소이름"이라는 자식 요소 List를 리턴한다.
  • Element.getTextTrim()은 요소의 텍스트에서 앞뒤 공백을 제거하고 리턴한다.
  • Element.getTextNormalize()은 요소의 텍스트에서 앞뒤 공백을 제거하고 중간에 나온 공백은 공백이 여러개라도 한개로 만들어 리턴한다.

속성

  • 속성 값 설정 첫번째 방식

    Attribute attribute =
      new Attribute("value", propertyValue); // 속성이름 value, 속성값 propertyValue
    element.setAttribute(attribute);
    
  • 속성 값 설정 두번째 방식

    element.setAttribute("value", propertyValue);
    
  • 속성 값 가져오기

    String text = element.getAttribut    eVal     ue("value"); // 속성 value의 값 가져오기
    
  • 속성 리스트 가져오기

    List attrs = element.getAttributes(); // 요소에 속한 속성(Attribute 객체)의 List
    

getContent()

Document나 Element 클래스에서 getContent()를 사용하면 컨텐트의 타입(요소, 처리지시어, 주석, 엔티티, 텍스트 등)과 상관없이 해당하는 모든 컨텐트를 리턴한다.
  • 주석을 XML문서의 맨 앞에 추가하려면 다음과 같이 해야한다. 그냥 doc.addContent(comment)를 하면 XML 문서의 맨 마지막에 주석이 추가되어 버린다.

    // doc 은 JDOM의 Document 객체이다.
    Comment comment = new Comment("이러쿵 저러쿵..");
    doc.getContent().add(0, comment);
    

XPath

XPath xpath = XPath.newInstance("/collection/dvd"); // XPath 문자열
List list = xpath.selectNodes(doc); // Document 객체

얻어진 list의 각 요소들을 Element, Attribute, String 등으로 캐스팅하여 사용하면 된다.

Element e = (Element)xpath.selectSingleNode(doc); 이처럼 XPath.selectSingleNode()를 사용하면 XPath결과 중에서 한 개의 값만을 가져올 수 있다.

XSLT

  • JDOM의 XSLTranformer는 파라미터를 받지 않는 문제가 있다. 이때 JAXP를 사용해야 한다.
  • 트랜스폼 결과는 Document로 리턴된다.

    StringWriter writer = new StringWriter();
    
    XSLTransformer transformer = new XSLTransformer("list.xsl");
    Document resultDoc= transformer.transform(doc); // Document 객체
    
    XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());
    out.output(resultDoc, stringWriter); // 문자열 Writer에 결과를 저장.
    
    out.println(stringWriter.toString()); // 문자열로 출력
    

+ Recent posts