프로그래밍/MSSQL
[MSSQL] XML 문자 파싱 오류 (XML 구문 분석: 잘못된 xml 문자입니다.)
초보개발자꽁쥐
2021. 1. 11. 23:11
반응형
XML 문자열을 파싱 하는 도중 오류가 발생했다.
메시지 9420, 수준 16, 상태 1, 줄 4
XML 구문 분석: 줄 1, 문자 37. 잘못된 xml 문자입니다.
살펴보다 보니, 파싱된 XML 문자열에서 ''이라는 문자열이 넘어오면서 오류가 발생한 것이다.
애초에 DB로 넘기기 전 해당 문자를 치환하는 방법도 있겠지만,
저는 DB 자체에서 해당 문자열을 정규식을 통해 제거하는 방법으로 처리해보겠습니다.
검색해보니 VARBINARY를 이용해서 하는 방법들이 나오던데,
실제 해보니 XML 전체 문자열이 변경되면서 이상한 데이터를 반환해서 저는 이 방법은 패스했습니다.
DECLARE @Expression VARCHAR(MAX) = '<root><name>ggmouse</name><age></age></root>' -- 검색할 문자열
SELECT CONVERT(XML, @Expression)
위의 문자열을 XML로 반환하려 했으나 오류가 발생했습니다.
바로 <age></age> 이부분 때문이죠
바로 XML 문자열에 아래 문자들이 포함되어 있을 경우 XML 변환 시 오류가 발생하게 됩니다.
�         	 
   
                   
DECLARE @Expression VARCHAR(MAX) = '<root><name>ggmouse</name><age></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)
반응형