본문 바로가기

[JAVA] Jdom을 이용한 XML 만들기, XPath를 이용한 XML 값 가져오기

다프트 코더 2024. 12. 20.
반응형

서버와 클라이언트 간 또는 서버끼리 메시지 인터페이스를 할 때 메시지 포맷을 정하고 그 포맷에 맞게 메시지를 보내고 받아야 한다. 요즘에는 메시지 포맷 방식이 Json 방식을 많이 사용하는데 과거에는 XML 방식을 많이 사용했었다. 그리고 현재도 XML 포맷 방식을 사용하는 곳이 많다. 그래서 Jdom 라이브러리를 이용해 Document를 만들고 이 Document를 XML 형식의 String 문자열로 변환하는 방법을 포스팅한다.

반응형

1. Jdom 라이브러리 의존성 추가하기

build.gradle 파일에 jdom2, jaxen 의존성을 추가한다. Maven 프로젝트일 경우 pom.xml에 의존성을 추가한다.

//gradle
// https://mvnrepository.com/artifact/org.jdom/jdom2
implementation group: 'org.jdom', name: 'jdom2', version: '2.0.6.1'
	
// https://mvnrepository.com/artifact/jaxen/jaxen
implementation group: 'jaxen', name: 'jaxen', version: '2.0.0'

2. XML 만들기

XML은 Jdom의 Element를 이용해서 Document를 생성한 다음 Document를 String으로 변환해서 XML 문자열을 만든다. 아래와 같은 구조의 XML을 만들어보자.

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<Friend>
		<Name>김진호</Name>
		<Age>7</Age>
		<Phone>123-1234-1234</Phone>
		<Class>A</Class>
	</Friend>
</root>

2-1. XML 값 만들기

root, Friend, Name, Age, Phone, Class Element를 생성해서 값을 넣어주고 addContent 함수로 Element를 서로 연결해 주면 된다.

public static void exampleByJdom() {
		
	Element friendElement = new Element("Friend");
	friendElement.addContent(new Element("Name").setText("김진호"));
	friendElement.addContent(new Element("Age").setText("7"));
	friendElement.addContent(new Element("Phone").setText("123-1234-1234"));
	friendElement.addContent(new Element("Class").setText("A"));

	Element rootNode = new Element("root");
	rootNode.addContent(friendElement);
		
	Document document = new Document(rootNode);
		
	String xml = (new XMLOutputter(Format.getRawFormat())).outputString(document);
		
	System.out.println(xml);	
    
}

2-2. XML 속성 만들기

XML 항목에 속성을 추가할 수 있다. 아래 XML처럼 Name 항목에 Language 속성을 만들어보자

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<Friend>
		<Name Language="KR">김진호</Name>
		<Age>7</Age>
		<Phone>123-1234-1234</Phone>
		<Class>A</Class>
	</Friend>
</root>

. setAttribute 함수를 이용해 속성 값을 만들 수 있다.

public static void exampleByJdom() {
		
	Element friendElement = new Element("Friend");
	friendElement.addContent(new Element("Name").setText("김진호").setAttribute("Language", "KR"));
	friendElement.addContent(new Element("Age").setText("7"));
	friendElement.addContent(new Element("Phone").setText("123-1234-1234"));
	friendElement.addContent(new Element("Class").setText("A"));

	Element rootNode = new Element("root");
	rootNode.addContent(friendElement);
		
	Document document = new Document(rootNode);
		
	String xml = (new XMLOutputter(Format.getRawFormat())).outputString(document);
		
	System.out.println(xml);
		
}
반응형

만약 2개 이상의 속성을 만들고 싶을 경우. setAttribute를 쭉 이어서 붙이면 된다.

friendElement.addContent(new Element("Name").setText("김진호").setAttribute("Language", "KR").setAttribute("Length", "5"));

그러면 최종적으로 아래 XML이 만들어진다. Name 항목에 Language, Length 속성이 만들어졌다.

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<Friend>
		<Name Language="KR" Length="5">김진호</Name>
		<Age>7</Age>
		<Phone>123-1234-1234</Phone>
		<Class>A</Class>
	</Friend>
</root>

3. XPath를 이용해 XML에서 값 가져오기

이제 생성한 XML 문자열에서 값을 가져오는 방법에 대해서 알아보자. XML 문자열을 Document로 변환한 다음 XPath를 이용해 특정 값을 가져올 수 있다. 

public static void xmlStringReading(String xml) throws JDOMException, IOException {
		
	Document document = new SAXBuilder().build(new StringReader(xml)); //String -> Document 변환
		
	Element nameElement = (Element)XPath.selectSingleNode(document, "//Friend/Name");
	Element ageElement = (Element)XPath.selectSingleNode(document, "//Friend/Age");
	Element phoneElement = (Element)XPath.selectSingleNode(document, "//Friend/Phone");
	Element classElement = (Element)XPath.selectSingleNode(document, "//Friend/Class");
		
	System.out.println("Name: " + nameElement.getText());
	System.out.println("Age: " + ageElement.getText());
	System.out.println("Phone: " + phoneElement.getText());
	System.out.println("Class: " + classElement.getText());
}

만약 Caused by: java.lang.ClassNotFoundException: org.jaxen.JaxenException 오류가 발생한다면 Jaxen 라이브러리 의존성을 추가해야 한다. 

// https://mvnrepository.com/artifact/jaxen/jaxen
implementation group: 'jaxen', name: 'jaxen', version: '2.0.0'

그러면 아래와 같은 결과가 나온다.

Name: 김진호
Age: 7
Phone: 123-1234-1234
Class: A

4. XPath를 이용해 XML에서 속성 값 가져오기

getAttributeValue 함수를 이용해 Name 항목의 속성 값을 가져올 수 있다. Name 항목에 Language, Length 속성 값을 가져오자

public static void xmlStringReading(String xml) throws JDOMException, IOException {
		
	Document document = new SAXBuilder().build(new StringReader(xml));
		
	Element nameElement = (Element)XPath.selectSingleNode(document, "//Friend/Name");
	Element ageElement = (Element)XPath.selectSingleNode(document, "//Friend/Age");
	Element phoneElement = (Element)XPath.selectSingleNode(document, "//Friend/Phone");
	Element classElement = (Element)XPath.selectSingleNode(document, "//Friend/Class");
		
	System.out.println("Name: " + nameElement.getText());
	System.out.println(" -Language: " + nameElement.getAttributeValue("Language"));
	System.out.println(" -Length: " + nameElement.getAttributeValue("Length"));
	System.out.println("Age: " + ageElement.getText());
	System.out.println("Phone: " + phoneElement.getText());
	System.out.println("Class: " + classElement.getText());

}
반응형

결과는 아래와 같다.

Name: 김진호
 -Language: KR
 -Length: 5
Age: 7
Phone: 123-1234-1234
Class: A

자바에서 Jdom을 이용해 Document를 만들어서 XML 문자열을 만들고 다시 XML 문자열을 Document로 변환해서 XML 값을 가져오는 방법을 정리하였다.

반응형

댓글