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=, 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=, Line Number="+m_intLineNum); } msgParent.MakeMessage(strStaKey, strValue); } } } } }