이 도구는 샘플 XML을 Java record 선언으로 바꿉니다. 먼저 모든 XML 변환기가 공유하는 규칙으로 XML을 데이터로 매핑하고, 레코드는 그 데이터를 설명합니다. 루트 레코드는 public, 중첩 레코드는 package-private이며 모두 한 파일에 들어가므로 결과를 .java 파일 하나에 그대로 붙여 넣을 수 있습니다.
이름은 자바 관례를 따라 @sku는 컴포넌트 sku, xml:lang은 xmlLang이 됩니다. 키가 컴포넌트 이름과 다를 때마다 Jackson의 @JsonProperty("@sku")가 붙어 ObjectMapper가 정확한 키로 읽고 씁니다. 레코드는 XML 자체가 아니라 변환된 데이터를 위한 모델이어서 JAXB 어노테이션과는 맞지 않습니다.
XML은 정확한 행·열 오류를 알려 주는 엄격한 XML 1.0 파서가 읽으며 20 MiB까지 처리하고 브라우저를 벗어나지 않습니다.
사용 방법
XML 붙여넣기
문서를 붙여 넣거나 API 응답, 중첩 배열, 엣지 케이스 예제를 고릅니다. 입력하면 레코드가 바로 갱신됩니다.
매핑 조정
XML 데이터 매핑 패널에서 속성 접두사, 텍스트 키, 항상 배열, 숫자 추론을 정합니다. 추론을 끄면 모든 컴포넌트가
String입니다.Java 옵션 정하기
루트 레코드 이름(기본
Payload), 선택 사항인 패키지, Jackson@JsonProperty어노테이션을 쓸지를 고릅니다.레코드 읽기
루트 레코드가 맨 위에 옵니다.
List와JsonPropertyimport는 코드에서 실제로 쓸 때만 나타납니다.복사 또는 다운로드
코드를 복사하거나 public 루트 레코드 이름의
Payload.java로 내려받습니다.
작동 원리
XML 값이 Java 타입이 되는 방식
매핑이 끝나면 모든 키에 타입이 정해집니다. 자바 레코드에는 기본값이 없으므로, 항상 있는 값은 기본형으로, 빠질 수 있는 값은 래퍼 타입으로 만듭니다.
| 데이터 | Java 타입 | 비고 |
|---|---|---|
| 텍스트 | String | CDATA와 빈 요소 포함 |
7, 3000000000 | long | 정수는 모두 long, 선택이면 Long |
19.5 | double | 선택이면 Double |
true | boolean | 선택이면 Boolean |
| 반복 요소 | List<Item> | java.util.List import 추가 |
007, 2^53보다 큰 ID | String | 추론 규칙상 텍스트로 유지 |
| 한 위치에 종류가 섞임 | List<Object> | 예: <v>1</v><v>a</v> |
어노테이션, 이름, Jackson 스위치
컴포넌트 이름은 접두 문자를 뺀 키의 카멜 케이스이고, 자바 키워드와 겹치거나 숫자로 시작하는 이름은 안전한 이름으로 바뀝니다. @JsonProperty는 컴포넌트 이름이 키와 다를 때만 붙으므로 customer에는 없고 @id, #text에는 있습니다. Jackson 옵션을 끄면 이 어노테이션과 import가 사라져 키가 다시 매핑되지 않습니다.
반복 요소의 모든 발생은 키의 합집합을 가진 레코드 하나가 됩니다. 일부에서 빠진 키는 Long, Double, Boolean, 레코드 클래스 같은 참조 타입이 되어 Jackson이 null로 채웁니다.
record PayloadOrderItem(
@JsonProperty("@sku")
String sku,
@JsonProperty("@qty")
Long qty
) {}자식이 하나일 때와 여럿일 때
<item>이 하나면 레코드 컴포넌트, 둘 이상이면 List입니다. 실제 데이터의 개수가 달라질 수 있으면 자식 요소는 항상 배열로 옵션을 켜세요. 그렇지 않으면 더 긴 문서에서 Jackson이 입력 불일치 예외를 던집니다.
실제 예시
<order id="1042"><item sku="A1" qty="1">Pen</item><item sku="B7">Ink</item></order>import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
public record Payload(
PayloadOrder order
) {}
record PayloadOrder(
@JsonProperty("@id")
long id,
List<PayloadOrderItem> item
) {}
record PayloadOrderItem(
@JsonProperty("@sku")
String sku,
@JsonProperty("@qty")
Long qty,
@JsonProperty("#text")
String text
) {}두 item이 레코드 하나를 공유합니다. 키가 이름과 다른 컴포넌트에만 @JsonProperty가 붙고, 한 item에 없는 qty는 래퍼 Long입니다.
<doc xml:lang="en" data-id="5"><title>Hi</title></doc>import com.fasterxml.jackson.annotation.JsonProperty;
public record Payload(
PayloadDoc doc
) {}
record PayloadDoc(
@JsonProperty("@xml:lang")
String xmlLang,
@JsonProperty("@data-id")
long dataId,
String title
) {}xml:lang은 xmlLang, data-id는 dataId가 되고 어노테이션에 실제 키가 남습니다. data-id는 기본형 long입니다.
<doc xml:lang="en" data-id="5"><title>Hi</title></doc>public record Payload(
PayloadDoc doc
) {}
record PayloadDoc(
String xmlLang,
long dataId,
String title
) {}어노테이션이 없으면 Jackson이 @xml:lang, @data-id 키를 맞출 수 없습니다. 키를 직접 바꿀 때만 이 설정을 쓰세요.
자주 하는 실수
레코드는 Java 16 이상이 필요합니다
결과는
record를 씁니다. 더 낮은 런타임이라면 컴포넌트를 final 필드와 getter로 다시 쓰고@JsonProperty는 그대로 유지하세요.어노테이션이 없으면 @ 키를 찾지 못합니다
id라는 컴포넌트는 키@id와 맞지 않습니다. Jackson 옵션을 켜 두거나 매핑 패널에서 속성 접두사를 빈 문자열로 바꾸세요.기본형과 래퍼 타입
항상 있는 컴포넌트는 기본형이라, 이후 문서에서
null이 오면 역직렬화가 실패합니다. 그런 경우가 있다면 샘플에 값이 빠진 사례를 넣어야 합니다.정수는 모두 long
3도long이고19.0은 숫자 19로 읽힙니다. 도메인에 필요하면int나BigDecimal로 직접 바꾸세요.
자주 묻는 질문
getter가 있는 클래스가 아니라 왜 레코드인가요?
레코드는 선언 하나로 불변 데이터 객체를 만들고 Jackson 2.12 이상이 역직렬화할 수 있습니다. 더 낮은 자바를 쓴다면 직접 클래스로 바꾸세요.
@JsonProperty는 언제 붙나요?
자바 컴포넌트 이름이 데이터의 키와 다를 때만 붙습니다. @id, #text, xml:lang이 그런 경우이고 일반 요소 이름에는 붙지 않습니다.
JAXB와 함께 쓸 수 있나요?
아니요. JAXB는 @XmlAttribute, @XmlElement가 필요합니다. 이 레코드는 XML to JSON 변환기가 만드는 변환 데이터를 위한 모델입니다.
package 줄은 어떻게 써지나요?
패키지 옵션을 채우면 맨 위에 package com.acme;가 추가됩니다. 비워 두면 기본 패키지입니다.
리스트가 왜 List<Object>인가요?
같은 요소 이름에 숫자와 단어처럼 종류가 다른 값이 있어 하나의 자바 타입으로 표현할 수 없기 때문입니다.
문서가 업로드되나요?
아니요. 모든 처리가 브라우저에서 이뤄지고 XML은 서버로 가지 않습니다.
마지막 업데이트:
