XML API 응답 개수가 DB 조회 개수와 달라요
StringEscapeUtils.escapeXML10
web
featured
xml
escapeXml10
unescapeXml
spring
StringEscapeUtils
Apache Commons
Intro
2021년 해군 소프트웨어개발병 시절 후임을 돕다 발견한 문제이다.
DB에서 조회되는 일부 항목이 왜 XML 응답에는 안 보일까?
Problem Analysis
사실 응답은 도착했다. 다만 Browser에서 XML Parse에 실패해 누락됐다.
Solution
다음과 같이 StringEscapeUtils.escapeXml10
을 거치면 문제가 되는 유니코드 문자가 제거 또는 Escape된다. 그리고 StringEscapeUtils.unescapeXml
로 일부 복원한다.
package yhkee0404.escapexml10.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.apache.commons.text.StringEscapeUtils;
@RestController
@RequiredArgsConstructor
public class XMLController {
private static final String unicodeXML =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
+ "<post>"
+ "<title>BACK\u0008SPACE</title>"
+ "<text>EXCLAMATION\u0021MARK</text>"
+ "</post>";
@GetMapping(value = "/xml", produces = MediaType.APPLICATION_XML_VALUE)
public String xml() {
// return unicodeXML;
return StringEscapeUtils.unescapeXml(StringEscapeUtils.escapeXml10(unicodeXML));
}
}
Deprecate된 org.apache.commons.lang3.StringEscapeUtils
에서 escapeXML
도 확인할 수 있다. 이제는 org.apache.commons.text.StringEscapeUtils
로 이동했다.
한편 EscapeXml11
도 있다. 그러나 DevSecOps Engineer Lee (2012) 에 따르면 XML 1.1은 권장되지 않는다. 그리고 MDN Web Docs (2023) 에 따르면 Browser 지원도 없다.
References
Lee, Linus. 2012. “XML 1.0을 써야하는 이유.” April 12, 2012. https://andromedarabbit.net/2012/04/12/xml-1-0%ec%9d%84-%ec%8d%a8%ec%95%bc%ed%95%98%eb%8a%94-%ec%9d%b4%ec%9c%a0/.
MDN Web Docs. 2023. “Document: xmlVersion Property.” April 7, 2023. https://developer.mozilla.org/en-US/docs/Web/API/Document/xmlVersion.
Citation
BibTeX citation:
@online{kee2024,
author = {Kee, Yunho},
title = {XML API 응답 개수가 DB 조회 개수와 달라요},
date = {2024-05-05},
url = {https://yhkee0404.github.io/posts/web/escape-xml10/},
langid = {ko}
}
For attribution, please cite this work as:
Kee, Yunho. 2024. “XML API 응답 개수가 DB 조회 개수와
달라요.” May 5, 2024. https://yhkee0404.github.io/posts/web/escape-xml10/.