jaxb

2 min read

java로 xml 파싱하기 jaxb

아래의 xml을 파싱하는 법이 여러가지 있는데 여기서는 jaxb로 파싱하는 법을 작성하려고 한다.


  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

그럼 먼저 라이브러리 추가


    <dependency>
      <groupId>org.glassfish.jaxb</groupId>
      <artifactId>jaxb-runtime</artifactId>
      <version>2.4.0-b180830.0438</version>
    </dependency>

여기서 파싱할 객체를 만들어 보면


package com.github.sejoung.jaxb.model;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Getter;
import lombok.ToString;

@Getter
@ToString
@XmlRootElement(name = "GlobalNamingResources")
public class GlobalNamingResources {

	@XmlElement(name = "Resource")
	private final List<Resource> resource = new ArrayList<>();


}


위에 객체를 만들고


package com.github.sejoung.jaxb.model;


import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Getter;
import lombok.ToString;

@Getter
@ToString
@XmlRootElement(name = "Resource")
public class Resource {

	@XmlAttribute
	private String name;
	@XmlAttribute
	private String auth;
	@XmlAttribute
	private String type;
	@XmlAttribute
	private String description;
	@XmlAttribute
	private String factory;
	@XmlAttribute
	private String pathname;


}


또 하나더 만든다음


package com.github.sejoung.jaxb;

import com.github.sejoung.jaxb.model.GlobalNamingResources;
import com.github.sejoung.jaxb.model.Resource;
import java.io.FileNotFoundException;
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;

public class JaxbMain {

	public static void main(String... args) throws JAXBException {

		JAXBContext context = JAXBContext.newInstance(GlobalNamingResources.class);
		StringReader reader = new StringReader("<GlobalNamingResources>\n"
				+ "    <Resource name=\"UserDatabase\" auth=\"Container\"\n"
				+ "\t\ttype=\"org.apache.catalina.UserDatabase\"\n"
				+ "\t\tdescription=\"User database that can be updated and saved\"\n"
				+ "\t\tfactory=\"org.apache.catalina.users.MemoryUserDatabaseFactory\"\n"
				+ "\t\tpathname=\"conf/tomcat-users.xml\" />\n"
				+ "  </GlobalNamingResources>");
		GlobalNamingResources resources = (GlobalNamingResources) context.createUnmarshaller()
				.unmarshal(reader);

		for (Resource fileInfo : resources.getResource()) {
			System.out.println(fileInfo);
		}

	}

}


실행결과


Resource(name=UserDatabase, auth=Container, type=org.apache.catalina.UserDatabase, description=User database that can be updated and saved, factory=org.apache.catalina.users.MemoryUserDatabaseFactory, pathname=conf/tomcat-users.xml)

Process finished with exit code 0

잘된다.

참조