using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.IO; using System.Data; namespace IControls_FireManager { // XML 생성 및 처리는 여기 클래스에서 전담한다 public static class _Xml { public static string Get_Value(string XML_Msg, string ElementName, string AttributeName) { try { TextReader stringReader = new StringReader(XML_Msg); XmlTextReader reader = new XmlTextReader(stringReader); if (XML_Msg == null || XML_Msg.Length == 0 || ElementName == null || ElementName.Length == 0) // null 값 허용안함 { return null; } else if (AttributeName == null || AttributeName.Length == 0) // 태그값 내용만 가져오기 { bool Get = false; while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: if (reader.Name == ElementName) Get = true; break; case XmlNodeType.Text: if (Get == true) return reader.Value.ToString(); break; } } } else // 속성값 가져오기 { while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: if (reader.Name == ElementName) { reader.MoveToAttribute(AttributeName); while (reader.ReadAttributeValue()) return reader.Value.ToString(); } break; } } } return null; // 중간에 리턴값이 없다면 (해당조건을 검색하지 못하면) Null 리턴함. } catch (Exception e) { // LOG _Event.DebugView_SendMessage_Write(e.ToString()); return null; // 중간에 리턴값이 없다면 (해당조건을 검색하지 못하면) Null 리턴함 } } public static string Get_Value(XmlTextReader reader, string ElementName, string AttributeName) { try { if (AttributeName == null || AttributeName.Length == 0) // 태그값 내용만 가져오기 { bool Get = false; while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: if (reader.Name == ElementName) Get = true; break; case XmlNodeType.Text: if (Get == true) return reader.Value.ToString(); break; } } } else // 속성값 가져오기 { while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: if (reader.Name == ElementName) { reader.MoveToAttribute(AttributeName); while (reader.ReadAttributeValue()) return reader.Value.ToString(); } break; } } } return null; // 중간에 리턴값이 없다면 (해당조건을 검색하지 못하면) Null 리턴함. } catch (Exception e) { // LOG _Event.DebugView_SendMessage_Write(e.ToString()); return null; // 중간에 리턴값이 없다면 (해당조건을 검색하지 못하면) Null 리턴함 } } // XML 주석 (XMLComment) public static StringBuilder Set_XMLComment(string Comment) { StringBuilder strPacket = new StringBuilder(); strPacket.Append("\r\n"); return strPacket; } // XML 생성 (XMLHeader) public static StringBuilder Set_XMLHeader() { StringBuilder strPacket = new StringBuilder(); strPacket.Append("\r\n"); return strPacket; } // XML 생성 (BodyHeader) // Body_Type : 통신용, 시스템설정용으로 구분 // head : 상위 및 하위 public static StringBuilder Set_BodyHeader(Xml_Body_Type Body_Type,bool Head) { StringBuilder strPacket = new StringBuilder(); switch(Body_Type) { case Xml_Body_Type.Program_Configuration: if (Head == true) strPacket.Append("\r\n"); else strPacket.Append(""); break; case Xml_Body_Type.TCPIP_Protocol: if (Head == true) strPacket.Append("\r\n"); else strPacket.Append(""); break; case Xml_Body_Type.FIRE_FieldSetting: if (Head == true) strPacket.Append("\r\n"); else strPacket.Append(""); break; case Xml_Body_Type.FIRE_Receiver: if (Head == true) strPacket.Append("\r\n"); else strPacket.Append(""); break; } return strPacket; } // XML 생성 (Body) // Key_Data 의 예시 "Key1=Data1;Key2=Data2" public static StringBuilder Set_Body(string Element_Name, string Element_Value, string KeyData, bool CarriageReturn) { try { StringBuilder strPacket = new StringBuilder(); strPacket.Append("<" + Element_Name); // 속성 이름 임시 저장소 string Temp_Names = _Convert.String_to_Key_Data(KeyData, true, true); // 제거 문자대로 분리시켜버림 string[] Column_Names = Temp_Names.Split(_Convert.Result_Char); // 속성 값 임시 저장소 string Temp_Values = _Convert.String_to_Key_Data(KeyData, false, true); // 제거 문자대로 분리시켜버림 string[] Column_Values = Temp_Values.Split(_Convert.Result_Char); // 개수만큼 만들어서 속성 값 생성 for (int i = 0; i < Column_Names.Length; i++) strPacket.Append(" " + Column_Names[i] + "=" + "\"" + Column_Values[i] + "\""); // 마무리 strPacket.Append("/>"); //strPacket.Append(Element_Value); //strPacket.Append(""); if (CarriageReturn == true) strPacket.Append("\r\n"); return strPacket; } catch (Exception e) { // LOG _Event.DebugView_SendMessage_Write(e.ToString()); return null; // 중간에 리턴값이 없다면 (해당조건을 검색하지 못하면) Null 리턴함 } } // 사용 예시 "Key1:Key2,"Data1:Data2" public static StringBuilder Set_Body(string charsTrim, string Element_Name, string Element_Value, string Attribute_Name, string Attribute_Value, bool CarriageReturn) { StringBuilder strPacket = new StringBuilder(); strPacket.Append("<" + Element_Name); // 구분자 설정 char[] charsToTrim = { Convert.ToChar(charsTrim) }; // 속성 이름 임시 저장소 string Temp_Names = Attribute_Name; // 제거 문자대로 분리시켜버림 string[] Attribute_Names = Temp_Names.Split(charsToTrim); // 속성 값 임시 저장소 string Temp_Values = Attribute_Value; // 제거 문자대로 분리시켜버림 string[] Attribute_Values = Temp_Values.Split(charsToTrim); // 개수만큼 만들어서 속성 값 생성 for (int i = 0; i < Attribute_Names.Length; i++) strPacket.Append(" " + Attribute_Names[i] + "=" + "\"" + Attribute_Values[i] + "\""); // 마무리 strPacket.Append("/>"); //strPacket.Append(Element_Value); //strPacket.Append(""); if (CarriageReturn == true) strPacket.Append("\r\n"); return strPacket; } // 특별 용도 // 상위에 있는 함수와는 별개로 끝나지 않는 태그로 구성 // ex) public static StringBuilder Set_Body_NotEnd(string Element_Name, string Element_Value, string KeyData, bool CarriageReturn) { try { StringBuilder strPacket = new StringBuilder(); strPacket.Append("<" + Element_Name); // 속성 이름 임시 저장소 string Temp_Names = _Convert.String_to_Key_Data(KeyData, true, true); // 제거 문자대로 분리시켜버림 string[] Column_Names = Temp_Names.Split(_Convert.Result_Char); // 속성 값 임시 저장소 string Temp_Values = _Convert.String_to_Key_Data(KeyData, false, true); // 제거 문자대로 분리시켜버림 string[] Column_Values = Temp_Values.Split(_Convert.Result_Char); // 개수만큼 만들어서 속성 값 생성 for (int i = 0; i < Column_Names.Length; i++) strPacket.Append(" " + Column_Names[i] + "=" + "\"" + Column_Values[i] + "\""); // 마무리 strPacket.Append(">"); //strPacket.Append(Element_Value); //strPacket.Append(""); if (CarriageReturn == true) strPacket.Append("\r\n"); return strPacket; } catch (Exception e) { // LOG _Event.DebugView_SendMessage_Write(e.ToString()); return null; // 중간에 리턴값이 없다면 (해당조건을 검색하지 못하면) Null 리턴함 } } // 상위에 있는 함수와는 별개로 끝나지 않는 태그를 읽기 public static bool Read_Receiver_XML(string ProjectPath) { try { // 일반 텍스트로 읽고 string xml = File.ReadAllText(ProjectPath); System.IO.StringReader reader = new StringReader(xml); // 데이타셋 DataSet ds = new DataSet(); // XML 파일을 인코딩 ds.ReadXml(reader, XmlReadMode.Auto); // 데이타셋의 테이블 두번째 바디부터 행별로 가져온다 DataRowCollection rows = ds.Tables[0].Rows; // 클래스를 각각 해쉬에 추가 foreach (DataRow row in rows) { //_ReceiverXML ReceiverXML = new _ReceiverXML(); //ReceiverXML.ID = row["ID"].ToString(); //ReceiverXML.IP = row["IP"].ToString(); //ReceiverXML.KEY_NAME = row["NAME"].ToString(); //// 해쉬 추가 //if (_Hash.Add(_Data.HASH_XMLRECEIVER, ReceiverXML.ID, ReceiverXML) == true) //{ // _Data.LIST_XMLRECEIVER_ID.Add(ReceiverXML.ID); //} } return true; } catch { return false; } } } }