본문 바로가기

프로그래밍/MSSQL

[MSSQL] XML 문자 파싱 오류 (XML 구문 분석: 잘못된 xml 문자입니다.)

반응형

 

 

 

XML 문자열을 파싱 하는 도중 오류가 발생했다.

 

메시지 9420, 수준 16, 상태 1, 줄 4
XML 구문 분석: 줄 1, 문자 37. 잘못된 xml 문자입니다.

 

살펴보다 보니, 파싱된 XML 문자열에서 ''이라는 문자열이 넘어오면서 오류가 발생한 것이다.

 

애초에 DB로 넘기기 전 해당 문자를 치환하는 방법도 있겠지만,

저는 DB 자체에서 해당 문자열을 정규식을 통해 제거하는 방법으로 처리해보겠습니다.

 

검색해보니 VARBINARY를 이용해서 하는 방법들이 나오던데,

실제 해보니 XML 전체 문자열이 변경되면서 이상한 데이터를 반환해서 저는 이 방법은 패스했습니다.

 

 

 

 

 

DECLARE	@Expression VARCHAR(MAX) = '<root><name>ggmouse</name><age>&#x01;</age></root>' -- 검색할 문자열

SELECT CONVERT(XML, @Expression)

 

 

위의 문자열을 XML로 반환하려 했으나 오류가 발생했습니다.

바로 <age>&#x01;</age> 이부분 때문이죠

 

 

바로 XML 문자열에 아래 문자들이 포함되어 있을 경우 XML 변환 시 오류가 발생하게 됩니다.

 

&#x0; &#x1; &#x2; &#x3; &#x4; &#x5; &#x6; &#x7; &#x8; &#x9; &#xa; &#xb; &#xc; &#xd; &#xe; &#xf; &#x10; &#x11; &#x12; &#x13; &#x14; &#x15; &#x16; &#x17; &#x18; &#x19; &#x1a; &#x1b; &#x1c; &#x1d; &#x1e; &#x1f; &#x7f;

 

DECLARE	@Expression VARCHAR(MAX) = '<root><name>ggmouse</name><age>&#x01;</age></root>' -- 검색할 문자열
DECLARE	@Pattern  VARCHAR(MAX) = '&#x[0-9a-fA-F]' -- 찾을 부분 패턴 정규식
DECLARE	@Replacement VARCHAR(MAX) = '' -- 대체 문자열

DECLARE @StartPoint INT = 0
DECLARE @EndPoint INT = 0

DECLARE @ReturnStr VARCHAR(MAX) = @Expression;

IF ISNULL(@ReturnStr,'') = ''
	RETURN;

WHILE 1=1
BEGIN

	-- 시작 문자열 위치 ('%&#x[0-9a-fA-F]%')
	SET @StartPoint = PATINDEX('%' + @Pattern + '%', @ReturnStr)

	IF ISNULL(@StartPoint,0) = 0
		BREAK;

	-- 종료 문자열 위치 (시작 문자열 위치 이후의 ;)
	SET @EndPoint = CHARINDEX(';', @ReturnStr, @StartPoint)

	-- 정규식에 맞는 문자열 제거
	SET @ReturnStr = STUFF(@ReturnStr, PATINDEX('%' + @Pattern + '%', @ReturnStr), @EndPoint-@StartPoint+1, @Replacement)

END


SELECT @Expression AS 'XML 문자열'
SELECT @ReturnStr AS 'XML 결과 문자열'

 

결과 데이터

 

 

 

 

 

[MSSQL] XML 데이터를 테이블 형태로 저장 (XML to DB)

 

 

반응형