[Java] XStream을 사용한 XML 파싱
XStream 라이브러리를 사용하여 XML 파싱하는 예제소스 입니다.
build.gradle 에 라이브러리 추가 (Gradle 사용 시)
// https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream compile group: 'com.thoughtworks.xstream', name: 'xstream', version: '1.4.9' |
Gradle 사용하지 않고 진행 시 라이브러리는 직접 다운받아서 추가해 줍니다.
main 소스
package xmlparse; import java.net.URL; import java.net.URLConnection; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; import xmlparse.vo.Book; import xmlparse.vo.Catalog; public class xmlparse { public static void main(String[] args) throws Exception { // XStream 인스턴스 생성 XStream xstream = new XStream(new DomDriver());
// alias 설정 XML tag, 담당할 class 지정 // 각 클래스는 해당 태그가 가진 항목을 구성하고 있다 xstream.alias("catalog", Catalog.class); xstream.alias("book", Book.class); xstream.addImplicitCollection(Catalog.class, "books");
// 태그의 어노테이션 처리 // <book id="xxx"> 에서 xxx 를 읽어오기 위해 필요하다 // [REF] http://stackoverflow.com/questions/18106619/xstreamasattribute-not-adding-as-attribute-xstream //xstream.autodetectAnnotations(true); // auto 속성을 지정하게 되면 모두 처리하는 듯 하다. (귀찮으면 걍 이거 쓰자 ;;) xstream.processAnnotations(Book.class); // 각 속성별로 읽어오도록 지정 한다.
// XML 로드 URL url = new URL("http://haebi.net/book.xml"); URLConnection conn = url.openConnection();
// 최상위 태그로부터 XML 파싱 Catalog var = (Catalog)xstream.fromXML(conn.getInputStream());
// 반복문 돌면서 처리한다 for(int i=0; i<var.books.size(); i++) { Book book = var.books.get(i); System.out.println(book.id); System.out.println(book.author); }
} } |
book.java
package xmlparse.vo; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; @XStreamAlias("book") public class Book { @XStreamAsAttribute public String id; public String author; public String title; public String genre; public String price; public String publish_date; public String description; // 갯수가 멀티개인 속성을 가지면... //@XStreamImplicit(itemFieldName="reply") //private ArrayList<string> reply } |
catalog.java
package xmlparse.vo; import java.util.LinkedList; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; @XStreamAlias("catalog") public class Catalog { public List<Book> books = new LinkedList<Book>(); } |
Depth 가 낮은 XML 처리에는 유용하겠는데, 깊어지면 답이 없어 보인다. ;;;
10 depth 까지 내려가면 클래스 언제 다 맹글어 -_-;;