프로그래밍/VC++

XML에서 사용하는 예약어 못쓰게 막기

panpro 2007. 11. 23. 11:54

XML 에 직접 사용해서는 안되는 예약 문자는 다음과 같다.

& < > " '

 그리고 각각은 다음과 같은 문자열 변환 과정을 통하여 저장해 주어야 한다.

<       
&lt;
 
>       
&gt;
 
&       
&amp;
 
"      
&quot;
 
'      
&apos;

 문자열 변환 과정을 거치지 않으면 파서가 정상적으로 인식할 수 없으므로 주의하도록 하자.


방법은 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("<", "&lt;");
 pstrDest->Replace(">", "&gt;");
 pstrDest->Replace("&", "&amp;");
 pstrDest->Replace("\"", "&quot;");
 pstrDest->Replace("'", "&apos;");

 return true;
}