MYMONDAY.ai
서비스스튜디오도구데이터·포맷73CSS 생성기19색상·이미지10인코딩·보안10웹·SEO11개발·데브옵스10파일·내보내기18계산기6가이드

XML SQL 변환기

XML 문서의 반복 요소를 CREATE TABLE 문과 묶음 INSERT 문으로 바꾸고 컬럼 타입은 값에서 추론합니다.

  • 브라우저에서 처리
  • 가입 없음
  • 무료

도구 작업 공간

예제

옵션

이 경로의 요소 하나가 한 행이 됩니다. 자동은 가장 바깥에서 반복되는 요소를 고릅니다.

방언

열 타입, 불리언 리터럴, 문자열 이스케이프가 달라집니다.

XML → 데이터 매핑

속성은 이 문자로 시작하는 키가 되어 id="1"은 @id가 됩니다. 비우면 속성 이름 그대로 씁니다.

속성이나 자식 요소와 함께 있는 텍스트는 이 키에 담습니다.

끄면 <item>이 하나일 땐 객체, 여러 개일 땐 배열이 됩니다. 켜면 개수와 상관없이 구조가 같습니다.

끄면 모든 값이 문자열로 남습니다. 켜면 true/false, 정수, 소수는 해당 타입이 되고 007이나 긴 ID는 문자열로 둡니다.

XML 입력

18줄403byte

결과

⌘/Ctrl + Enter로 복사
결과 · records.sql
CREATE TABLE "records" (
  "id" INTEGER NOT NULL,
  "active" BOOLEAN NOT NULL,
  "name" TEXT NOT NULL,
  "email" TEXT,
  "score" DOUBLE PRECISION NOT NULL
);

INSERT INTO "records" ("id", "active", "name", "email", "score") VALUES
  (1, TRUE, 'Ada Lovelace', 'ada@example.com', 98.5),
  (2, FALSE, 'Grace Hopper', 'grace@example.com', 91),
  (3, TRUE, 'Linus', NULL, 87.25);

레코드 users/user · 3개 행

행3
열5
크기375byte

<user>나 <order> 요소가 여러 개 들어 있는 XML 문서의 목록을 읽어 CREATE TABLE 문과 요소당 한 행의 INSERT 문을 만드는 XML SQL 변환기입니다. 레코드 경로 선택기가 같은 이름의 형제가 반복되는 모든 경로를 행 수와 함께 보여 주고, 자동은 가장 바깥의 경로를 고릅니다. 안쪽 목록을 넣고 싶으면 다른 경로를 고르세요.

컬럼 이름은 속성과 자식 요소에서 옵니다. 이 변환기는 속성 접두사가 기본적으로 비어 있어 id="1"이 id 컬럼이 됩니다. 컬럼 타입은 모든 행의 값에서 추론해 INTEGER, BIGINT, 부동소수점, BOOLEAN, TEXT 중에서 정하고, PostgreSQL, MySQL, SQLite는 타입 이름, 불리언 리터럴, 따옴표 방식이 서로 다릅니다. 일부 행에 없는 컬럼은 NULL을 허용하고, NOT NULL을 켜면 모든 행에 있는 컬럼은 NOT NULL로 선언합니다.

XML은 페이지 안의 엄격한 XML 1.0 파서가 읽으며 오류는 줄과 열로 표시됩니다. 최대 20 MiB를 로컬에서 처리하고 업로드하지 않습니다. SQL을 복사하거나 테이블 이름을 딴 파일로 내려받으세요.

사용 방법

  1. XML 붙여넣기

    문서를 붙여 넣거나 예제를 고르세요. XML이 올바르지 않으면 SQL 대신 첫 문제의 줄과 열이 표시됩니다.

  2. 레코드 경로 선택

    자동(가장 바깥에서 반복되는 요소)을 유지하거나 선택기에서 다른 반복 경로를 고르세요. 경로 옆에 행 수가 표시됩니다.

  3. 테이블 이름과 방언 선택

    테이블 이름을 입력하고 PostgreSQL, MySQL, SQLite 중에서 고르세요. 방언에 따라 식별자 따옴표, 타입 이름, 불리언 리터럴이 달라집니다.

  4. NOT NULL과 매핑 설정

    NOT NULL 가능한 곳을 켜거나 끕니다. XML → 데이터 매핑 패널에서 속성 접두사를 추가하거나 타입 해석을 꺼서 모든 컬럼을 TEXT로 만들 수 있습니다.

  5. 안내 확인 후 복사·다운로드

    중첩 요소가 JSON 텍스트로 저장되었거나 한 컬럼에 텍스트와 다른 타입이 섞였으면 안내가 표시됩니다. SQL을 복사하거나 .sql 파일로 내려받으세요.

작동 원리

행, 컬럼, 타입

레코드 경로의 요소 하나하나가 한 행입니다. 요소는 공통 XML 규칙으로 매핑되고 그 키가 처음 나타난 순서대로 컬럼이 됩니다. 레코드 경로가 텍스트만 가진 요소를 가리키면 각 행은 value라는 컬럼 하나에 저장됩니다.

컬럼 타입은 모든 행의 값에서 정해집니다. 32비트 범위의 정수는 INTEGER, 더 큰 정수는 BIGINT이고, 소수는 PostgreSQL에서 DOUBLE PRECISION, MySQL에서 DOUBLE, SQLite에서 REAL입니다. true/false는 PostgreSQL과 MySQL에서 BOOLEAN, SQLite에서 INTEGER가 됩니다. 정수와 소수가 섞이면 숫자형을 유지하고, 그 밖의 혼합은 TEXT로 처리합니다.

컬럼의 값PostgreSQLMySQLSQLite
1, 2, 3INTEGERINTINTEGER
98.5, 91DOUBLE PRECISIONDOUBLEREAL
true, falseBOOLEANBOOLEANINTEGER
텍스트TEXTTEXTTEXT
중첩 요소JSONBJSONTEXT

중첩 요소와 반복 자식

관계형 행은 평평하므로 다른 요소를 품은 요소는 여기서 여러 컬럼으로 나뉘지 않습니다. 중첩 요소나 반복 자식은 한 컬럼에 JSON 텍스트로 저장되며, 타입은 PostgreSQL에서 JSONB, MySQL에서 JSON, SQLite에서 TEXT이고 어느 컬럼이 그렇게 처리됐는지 안내합니다. 그 자식들을 별도 행으로 쓰고 싶으면 레코드 경로를 그쪽으로 바꾸거나 적재 후에 정규화하세요.

문자열 값은 작은따옴표를 두 번 써서 감싸고, MySQL은 역슬래시를 기본적으로 이스케이프로 읽기 때문에 역슬래시도 두 번 씁니다. 식별자는 PostgreSQL과 SQLite에서 큰따옴표, MySQL에서 백틱으로 감쌉니다. 행은 INSERT 문 하나당 500개씩 묶어 씁니다.

실제 예시

사용자를 PostgreSQL로
입력
<users>
  <user id="1" active="true"><name>Ada Lovelace</name><email>ada@example.com</email><score>98.5</score></user>
  <user id="2" active="false"><name>Grace Hopper</name><email>grace@example.com</email><score>91</score></user>
  <user id="3" active="true"><name>Linus</name><score>87.25</score></user>
</users>
출력
CREATE TABLE "records" (
  "id" INTEGER NOT NULL,
  "active" BOOLEAN NOT NULL,
  "name" TEXT NOT NULL,
  "email" TEXT,
  "score" DOUBLE PRECISION NOT NULL
);

INSERT INTO "records" ("id", "active", "name", "email", "score") VALUES
  (1, TRUE, 'Ada Lovelace', 'ada@example.com', 98.5),
  (2, FALSE, 'Grace Hopper', 'grace@example.com', 91),
  (3, TRUE, 'Linus', NULL, 87.25);

마지막 행에 email이 없으므로 그 컬럼은 NULL을 허용하고 값은 NULL입니다. 기본 테이블 이름은 records입니다.

같은 목록을 MySQL로
입력
<users><user id="1" active="true"><name>Ada Lovelace</name><score>98.5</score></user><user id="2" active="false"><name>Grace Hopper</name><score>91</score></user></users>
출력
CREATE TABLE `users` (
  `id` INT NOT NULL,
  `active` BOOLEAN NOT NULL,
  `name` TEXT NOT NULL,
  `score` DOUBLE NOT NULL
);

INSERT INTO `users` (`id`, `active`, `name`, `score`) VALUES
  (1, TRUE, 'Ada Lovelace', 98.5),
  (2, FALSE, 'Grace Hopper', 91);

설정은 방언 MySQL, 테이블 이름 users입니다. 식별자는 백틱을 쓰고 정수는 INT입니다.

중첩 요소와 반복 자식
입력
<store><orders>
<order id="1"><customer><name>Ada</name><city>London</city></customer><tag>new</tag><tag>vip</tag><total>120.5</total></order>
<order id="2"><customer><name>Grace</name><city>New York</city></customer><total>80</total></order>
<order id="3"><customer><name>Linus</name></customer><tag>bulk</tag><total>1200</total></order></orders></store>
출력
CREATE TABLE "orders" (
  "id" INTEGER NOT NULL,
  "customer" JSONB NOT NULL,
  "tag" TEXT,
  "total" DOUBLE PRECISION NOT NULL
);

INSERT INTO "orders" ("id", "customer", "tag", "total") VALUES
  (1, '{"name":"Ada","city":"London"}', '["new","vip"]', 120.5),
  (2, '{"name":"Grace","city":"New York"}', NULL, 80),
  (3, '{"name":"Linus"}', 'bulk', 1200);

설정은 테이블 이름 orders입니다. customer 요소는 JSONB로 저장됩니다. tag 컬럼에는 배열과 일반 텍스트가 섞여 TEXT가 되고, JSON 컬럼과 혼합 컬럼에 대한 안내가 표시됩니다.

자주 하는 실수

  • 모양이 섞이면 TEXT 컬럼

    한 레코드에서는 요소 하나, 다른 레코드에서는 여러 개인 <tag>는 같은 컬럼에 일반 텍스트와 JSON 텍스트를 함께 만듭니다. 원본에서 모양을 일관되게 만들거나, 반복 자식을 다른 레코드 경로로 별도 테이블에 적재하세요.

  • 타입 해석이 컬럼 타입을 정함

    24.50과 1.10은 숫자로 읽혀 컬럼이 부동소수점이 되고 끝자리 0이 사라집니다. 앞자리가 0인 우편번호는 텍스트로 남습니다. 해석을 끄면 모든 컬럼이 TEXT가 되므로 SQL에서 나중에 캐스팅하세요.

  • 키, 제약조건, 관계가 없음

    출력에는 PRIMARY KEY, FOREIGN KEY, 인덱스가 없습니다. 직접 추가하고, 하이픈이 든 요소 이름은 따옴표로 감싸지만 조회하기 불편하므로 생성된 컬럼 이름이 스키마에 맞는지 확인하세요.

  • 방언 차이

    SQLite에는 진짜 BOOLEAN이 없어 true와 false가 정수로 쓰입니다. MySQL은 도구가 적용하는 백틱 따옴표와 두 번 쓴 역슬래시가 필요합니다. 적재할 데이터베이스에 맞는 방언을 고르세요.

  • 큰 목록

    한 결과의 행과 열 수에는 한도가 있습니다. 아주 큰 내보내기는 XML을 먼저 나누거나 벌크 로더를 쓰세요.

자주 묻는 질문

어떤 요소가 테이블 행이 되나요?

레코드 경로의 모든 요소입니다. 자동은 같은 이름의 형제가 반복되는 가장 바깥 경로를 고르고, 선택기에서 다른 경로를 고를 수 있습니다.

컬럼 이름은 어떻게 정해지나요?

속성과 자식 요소의 이름입니다. 속성 접두사가 기본적으로 비어 있어 속성 id는 id 컬럼이 됩니다. 속성과 자식 요소 이름이 겹치면 매핑 패널에서 접두사를 지정하세요.

중첩 요소는 어떻게 저장되나요?

한 컬럼에 JSON 텍스트로 저장되고 타입은 PostgreSQL에서 JSONB, MySQL에서 JSON, SQLite에서 TEXT입니다.

NOT NULL 가능한 곳은 무엇을 하나요?

모든 행에 값이 있는 컬럼을 NOT NULL로 선언합니다. 일부 행에 없는 컬럼은 NULL을 허용하고 그 행에서 NULL이 들어갑니다.

테이블 이름을 바꿀 수 있나요?

네. 기본값은 records이고 빈 테이블 이름은 거부됩니다.

XML이 어딘가로 전송되나요?

아니요. 파싱과 SQL 생성이 브라우저 안에서 실행되며 최대 20 MiB까지 처리합니다.

마지막 업데이트: