XML 에 직접 사용해서는 안되는 예약 문자는 다음과 같다.
& < > " '
그리고 각각은 다음과 같은 문자열 변환 과정을 통하여 저장해 주어야 한다.
< <
> >
& &
" "
' '
문자열 변환 과정을 거치지 않으면 파서가 정상적으로 인식할 수 없으므로 주의하도록 하자.
방법은 2가지다. 아예 입력을 못하게 막는 방법. 그리고 일단 입력은 하게 해 놓고 변환하는 방법.
첫번째 아예 입력을 못하게 하는 방법은 다음과 같다.
BOOL CCMSRegistDlg::PreTranslateMessage(MSG* pMsg)
{
bool bX = false;
if (pMsg->message == WM_KEYDOWN)
{
if (GetKeyState(VK_SHIFT) < 0)
{
if (pMsg->wParam == '7') bX = true; // & 막기
if (pMsg->wParam == '5') bX = true; // % 막기
if (pMsg->wParam == 188) bX = true; // < 막기
if (pMsg->wParam == 190) bX = true; // > 막기
TRACE("With Shift : %d\n", pMsg->wParam);
}
else
TRACE("Without Shift : %d\n", pMsg->wParam);
if (pMsg->wParam == VK_RIGHT)
return CDialog::PreTranslateMessage(pMsg);
if (pMsg->wParam == 222)
bX = true; // ' 막기
if (pMsg->wParam == '"')
bX = true; // " 막기
if (bX)
{
MessageBox("사용할 수 없는 문자입니다.");
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
이렇게 하면 아예 입력을 못해 버린다.
입력은 하게 하고 변환해서 보내버리는 방법은 다음과 같다.
bool AvoidXMLReservedWord(const CString strSrc, CString * pstrDest)
{
// 원본 내용 복사
pstrDest->Format("%s", strSrc);
pstrDest->Replace("<", "<");
pstrDest->Replace(">", ">");
pstrDest->Replace("&", "&");
pstrDest->Replace("\"", """);
pstrDest->Replace("'", "'");
return true;
}
'프로그래밍 > VC++' 카테고리의 다른 글
ActiveX에서 Param 태그의 값 가져오게 하기 (0) | 2008.02.25 |
---|---|
VC2003 단축키 (0) | 2007.11.24 |
버튼 동적 생성과 이벤트 연결 (0) | 2007.11.22 |
CPPUnit 제대로 써보자. (0) | 2007.10.28 |
CFile 클래스를 이용해 파일크기 가져오기 (0) | 2007.10.28 |