using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PosStart
{
///
/// It is a summary Description for XmlBase
/// (XmlBase에 대한 요약 설명입니다.)
///
public class XmlBase
{
private string m_strInput = ""; // 받은 데이타보관
///
/// Initializes new instance of Constructor, XmlBase Class.
/// (Constructor, XmlBase 클래스의 새 인스턴스를 초기화합니다.)
///
public XmlBase()
{
//
// TODO: 여기에 생성자 논리를 추가합니다.
}
///
/// Initializes new instance of Constructor, XmlBase Class.
/// (Constructor, XmlBase 클래스의 새 인스턴스를 초기화합니다.)
///
/// 입력 데이타 - Input Data
public XmlBase(string pStrInput)
{
// 입력된 데이타를 보관합니다
//**************************************************************************************
m_strInput = pStrInput.Trim();
}
///
/// Parses Message and returns it as Hashtable format of Message
/// (메세지를 파싱하여 Message의 Hashtable 형태로 리턴)
///
public CmMessage ParserStart()
{
try
{
// 한 라인을 읽어서 데이타가 없으면 종료합니다.
//**************************************************************************************
string strNewLine = ReadNewLine();
if (strNewLine == null) return null;
// XML의 시작 Tag에 사용된 이름이 없습니다.
//**************************************************************************************
int iLpos = strNewLine.IndexOf("<");
int iRpos = strNewLine.IndexOf(">", iLpos);
strNewLine = strNewLine.Substring(iLpos + 1, iRpos - iLpos - 1);
if (strNewLine == "") return null;
// 시작 Tag의 이름을 이용하여 메세지를 만들어서 Parsing을 시작합니다.
//**************************************************************************************
CmMessage rtnMessage = new CmMessage(strNewLine);
ParsingNewLine(rtnMessage);
// Parsing한 메세지를 리턴합니다.
//**************************************************************************************
return rtnMessage;
}
catch
{
return null;
}
}
///
/// Reads 1 line from the first to \n, and returns it after removing blanks, etc.
/// (처음부터 \n까지 1라인을 읽어서 공백등을 제거하고 리턴)
///
private string ReadNewLine()
{
string strNewLine = null;
// 마지막 라인을 체크하여 종료를 리턴
//**************************************************************************************
if (m_strInput == null || m_strInput.Length == 0) return null;
// 마지막 라인부터 1라인을 읽어서 보관합니다.
//**************************************************************************************
//m_intLineNum++;
int intPos = m_strInput.IndexOf("\n");
if (intPos < 0) // 마지막 데이타
{
strNewLine = m_strInput.Trim(); // 읽은 라인
m_strInput = null; // 파일끝 설정
}
else
{
strNewLine = m_strInput.Substring(0, intPos).Trim(); // 읽은 라인
m_strInput = m_strInput.Substring(intPos + 1); // 파일의 남은라인들
}
// 빈줄이거나 "//" 주석으로 시작되면 새로운 라인을 읽습니다.
//**************************************************************************************
if (strNewLine.Length <= 2 || strNewLine.Substring(0, 2) == "//")
{
strNewLine = ReadNewLine();
}
return strNewLine;
}
///
/// Parses values of "<" and"/>" and saves them into Message Hashtable
/// ("<"와 "/>"의 값을 Parsing하여 Message Hashtable에 보관)
///
private void ParsingNewLine(CmMessage msgParent)
{
while (true)
{
// 1 라인씩 Parsing 하여 Message에 보관합니다.
//**********************************************************************************
string strNewLine = ReadNewLine();
if (strNewLine == null) return; // Parsing 정상종료
// 1 라인씩 Parsing 하여 Message에 보관합니다.
//**********************************************************************************
int intStaKeyLeft = strNewLine.IndexOf("<"); //
int intEndKeyLeft = strNewLine.IndexOf(""); //
if (intEndKeyLeft < 0) // 형태
{
int intStaKeyRight = strNewLine.IndexOf(">", Math.Max(0, intStaKeyLeft));
string strStaKey = strNewLine.Substring(intStaKeyLeft + 1, intStaKeyRight - intStaKeyLeft - 1);
CmMessage msgChild = new CmMessage(strStaKey);
ParsingNewLine(msgChild);
msgParent.MakeMessage(msgChild.MessageName, msgChild);
}
else if (intStaKeyLeft == intEndKeyLeft) // 형태
{
int intEndKeyRight = strNewLine.IndexOf(">", Math.Max(0, intEndKeyLeft));
string strEndKey = strNewLine.Substring(intEndKeyLeft + 2, intEndKeyRight - intEndKeyLeft - 2);
if (msgParent.MessageName != strEndKey) // 부모 메시지 Head Tag와 다르면 에러
{
// ConsoleNx.WriteLine("CuParser Error : Mismatched 1 !!! StartTag=<"+msgParent.MessageName+"> EndTag="+strEndKey+">, Line Number="+m_intLineNum);
}
break; // XML 대분류 종료
}
else // strValue 형대
{
int intStaKeyRight = strNewLine.IndexOf(">", Math.Max(0, intStaKeyLeft));
int intEndKeyRight = strNewLine.IndexOf(">", Math.Max(0, intEndKeyLeft));
string strValue = strNewLine.Substring(intStaKeyRight + 1, intEndKeyLeft - intStaKeyRight - 1);
string strStaKey = strNewLine.Substring(intStaKeyLeft + 1, intStaKeyRight - intStaKeyLeft - 1);
string strEndKey = strNewLine.Substring(intEndKeyLeft + 2, intEndKeyRight - intEndKeyLeft - 2);
if (strStaKey != strEndKey) // 시작 Tag와 종료 Tag가 다르면 에러
{
// ConsoleNx.WriteLine("CuParser Error : Mismatched 2 !!! StartTag=<"+strStaKey+"> EndTag="+strEndKey+">, Line Number="+m_intLineNum);
}
msgParent.MakeMessage(strStaKey, strValue);
}
}
}
}
}