HTTP 통신을 통해 XML 데이터를 ReqeustBody로 받아서 파싱 후 처리한 후 다시 Response Body로 반환하는 API를 만들었다. 그 과정에서 xml 데이터를 String으로 받아서 Document 객체로 변환하고 Tag 들을 파싱 하여 값을 조회하고 수정하는 방법에 그리고 다시 Document를 String으로 변환하는 방법에 대해서 정리하였다.
기본 내장 라이브러리를 사용하기 때문에 build.gradle에 따로 의존성 추가할 건 없다.
// build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.3'
id 'io.spring.dependency-management' version '1.1.4'
}
java {
sourceCompatibility = '17'
}
XML 문자열을 파싱하여 Document 객체로 변환
public Document stringToXml(String xmlRaw) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// XML 문자열을 파싱하여 DOM 객체로 변환
Document document = builder.parse(new InputSource(new StringReader(xmlRaw)));
return document;
}
- xml을 file로 받는 경우 builder.paser()에 매개변수로 파일의 절대 경로를 넣어주면 된다.
전달 받은 Document 객체에 NameSpace 속성을 설정하는 메서드
String nameSpaceRequest = "xmlns:nsName";
String nameSpaceRequestValue = "<http://www.aa.com/aa/aa/aaa/ns/nsName>";
public void setDocumentAttribute(Document document) {
document.getDocumentElement().setAttribute(nameSpaceRequest, nameSpaceRequestValue);
}
Document 객체를 String으로 변환하는 메서드
public String documentToString(Document document) throws ParserConfigurationException, TransformerConfigurationException, TransformerException {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(document), new StreamResult(writer));
String output = writer.getBuffer().toString();
return output;
}
HTTP 헤더 설정
// Controller
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(HttpHeaders.CONTENT_TYPE, "application/xml");
return ResponseEntity.ok().headers(httpHeaders).body(responseBody);
- HttpHeader 설정 안해주면 xml이 아니라 Text 형식으로 반환하기 때문에 Controller 단에서 헤더 설정을 추가해줘야 한다.
Tag Value 조회
public Map<String, String> paramParser(Document document, List<String> tagList){
// 태그명 : 태그값 형태의 Map
Map<String, String> result = new HashMap<>();
// tagList : 찾고자 하는 태그 리스트
for (String tag : tagList) {
// 태그 이름(tag)와 일치하는 모든 요소를 NodeList에 저장
NodeList nodeList = document.getElementsByTagName(tag);
if (nodeList.getLength() > 0) {
Element element = (Element) nodeList.item(0);
String tagValue = element.getTextContent();
result.put(tag, tagValue);
} else {
log.error("해당 태그를 찾을 수 없습니다.");
}
}
return result;
}
Tag Value 변경
public Document xmlMaker(Document document, String tagName) throws ParserConfigurationException, SAXException, IOException {
NodeList nodeList = document.getElementsByTagName(tagName);
if (nodeList.getLength() > 0) {
Element element = (Element) nodeList.item(0);
element.setTextContent("변경 값");
} else {
log.error("해당 태그를 찾을 수 없습니다.");
}
return document;
}
반응형
'Study > Spring' 카테고리의 다른 글
스웨거 GET API 응답 속도 저하 해결 (1) | 2024.03.29 |
---|---|
Springboot에서 Redis 사용 방법 정리 (0) | 2023.12.01 |
[트러블슈팅] NCP SENS API 호출 시, 401 Unauthorized 에러 (0) | 2023.11.08 |
네이버 SENS API 사용 방법(feat. Feign Client) (1) | 2023.11.08 |
연관관계 매핑 기본 개념 (0) | 2022.11.17 |