XML 구문 분석 및 방출 동작 변경 사항(보류 중)¶
이 동작 변경 번들을 활성화하면 COPY INTO <테이블> 명령을 XML 파일 형식으로 사용할 때와 다음 함수를 호출할 때 XML 내용을 구문 분석하고 출력하는 방식이 변경됩니다.
- 변경 전:
XML 구문 분석 및 방출 동작:
CHECK_XML 함수를 호출하는 일부 쿼리는 오류 메시지와 함께 문자열을 반환합니다.
PARSE_XML 함수를 호출하는 일부 쿼리가 실패합니다.
- 변경 후:
XML 구문 분석 및 방출 동작:
변경 전 CHECK_XML 함수를 호출할 때 오류 메시지와 함께 문자열을 반환하던 일부 쿼리가 이제는 NULL 을 반환합니다.
변경 전 PARSE_XML 함수를 호출할 때 실패했던 일부 쿼리가 이제 성공하며, 함수는 구문 분석된 XML 을 반환합니다.
대괄호 또는 아포스트로피를 포함하는 XML 문자열이 포함된 쿼리는 변경 후 다른 결과를 반환합니다.
공백이 포함된 XML 문자열 또는 공백 보존과 관련된 XML 특성이 있는 쿼리는 변경 후 다른 결과를 반환합니다.
다음 섹션에서 변경 사항에 대한 자세한 내용을 확인할 수 있습니다.
처리 지침이 포함된 XML 내용 구문 분석하기¶
다음은 PARSE_XML 함수를 사용하여 처리 지침에 물음표가 있는 XML 내용을 구문 분석하는 예입니다.
SELECT PARSE_XML('<?PITarget PIContent ??><mytag />') AS mytag;
- 변경 전에 반환되었습니다.:
100100 (22P02): Error parsing XML: prematurely terminated XML document in processing instructions, pos 33
- 변경 후에 반환되었습니다.:
+-----------------+ | MYTAG | |-----------------| | <mytag></mytag> | +-----------------+
꺾쇠 괄호 또는 아포스트로피가 포함된 XML 내용 구문 분석하기¶
다음은 PARSE_XML 함수를 사용하여 XML 특성 값에 꺾쇠 괄호와 아포스트로피를 포함하는 XML 내용을 구문 분석하는 예입니다. 변경 후 XML 특성 값의 아포스트로피와 꺾쇠 괄호는 반환 값과 전송된 XML에서 올바르게 이스케이프 처리됩니다.
SELECT PARSE_XML('<mytag myattr="<>\'"/>') AS mytag;
- 변경 전에 반환되었습니다.:
+------------------------------+ | MYTAG | |------------------------------| | <mytag myattr="<>'"></mytag> | +------------------------------+
- 변경 후에 반환되었습니다.:
+-----------------------------------------+ | MYTAG | |-----------------------------------------| | <mytag myattr="<>'"></mytag> | +-----------------------------------------+
사용자 정의 엔터티가 포함된 XML 내용 구문 분석하기¶
다음 예에서는 PARSE_XML 함수를 사용하여 사용자 정의 엔터티가 포함된 XML 내용을 구문 분석합니다.
SELECT PARSE_XML('<!DOCTYPE doc [<!ENTITY placeholder "some text">]><doc>&placeholder;</doc>')
AS placeholder;
- 변경 전에 반환되었습니다.:
100100 (22P02): Error parsing XML: unknown entity &placeholder;, pos 68
- 변경 후에 반환되었습니다.:
+-------------------------------------------------------------+ | PLACEHOLDER | |-------------------------------------------------------------| | <!DOCTYPE doc [<!ENTITY placeholder "some | | text">]><doc>some text</doc> | +-------------------------------------------------------------+
공백을 보존하는 XML 내용 구문 분석하기¶
공백 보존에 관한 XML 사양 과 Snowflake의 동작이 일치하도록 이 변경이 이루어졌습니다.
변경 전에는
xsl:space="preserve"
특성에 공백이 유지됩니다. 변경 후에는xsl:space="preserve"
특성에 공백이 보존되지 않습니다.변경 전에는
xml:space="preserve"
특성에 공백이 보존되지 않았습니다. 변경 후xml:space="preserve"
특성에는 공백이 유지됩니다.
다음은 PARSE_XML 함수를 사용하여 XML 내용을 구문 분석하고 xsl:space="preserve"
특성을 지정하는 예입니다.
SELECT PARSE_XML('<mytag xsl:space="preserve"> my content </mytag>')
AS space_preserve;
- 변경 전에 반환되었습니다.:
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xsl:space="preserve"> my content </mytag> | +--------------------------------------------------+
- 변경 후에 반환되었습니다.:
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xsl:space="preserve">my content</mytag> | +--------------------------------------------------+
다음은 PARSE_XML 함수를 사용하여 XML 내용을 구문 분석하고 xml:space="preserve"
특성을 지정하는 예입니다.
SELECT PARSE_XML('<mytag xml:space="preserve"> my content </mytag>')
AS space_preserve;
- 변경 전에 반환되었습니다.:
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xml:space="preserve">my content</mytag> | +--------------------------------------------------+
- 변경 후에 반환되었습니다.:
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xml:space="preserve"> my content </mytag> | +--------------------------------------------------+
공백을 보존하는 XML 내용 로딩하기¶
다음은 COPY INTO <table> 명령을 사용하여 테이블에 데이터를 로딩하는 예입니다. PRESERVE_SPACE 매개 변수는 공백을 보존하기 위해 TRUE 로 설정됩니다.
COPY INTO mytable
FROM @my_xml_stage
FILE_FORMAT = (TYPE = 'XML' PRESERVE_SPACE = TRUE);
- 변경 전 로딩된 콘텐츠::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xsl:space="preserve"> my content </mytag> | +--------------------------------------------------+
- 변경 후 로딩된 콘텐츠::
+--------------------------------------------------+ | SPACE_PRESERVE | |--------------------------------------------------| | <mytag xml:space="preserve"> my content </mytag> | +--------------------------------------------------+
변경 전후의 내용은 공백을 유지하지만 특성은 xsl:space="preserve"
에서 xml:space="preserve"
로 변경됩니다.
참조: 1862