C#/C# WPF 실무

[C# WPF] XML 에서 자식 노드 명과 자식 노드 값 가져오기

냠냠쿠 2023. 9. 11. 11:57
728x90

 

- xml파일 

<메서드명>
  <Parameters>
      <파라미터명1>test</파라미터명1>
     <파라미터명2> 1</파라미터명2>
  </Parameters>

 

- 클래스파일 

        public List<string> getQuery(string path, string queryName)
        {

            // path 가져오기 
            string _path = path;

            // xml 연결 
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(_path);

            // xml에서 쿼리값 가져오기 
            XmlNode ctg_node = xmlDoc.SelectSingleNode(queryName);
            XmlNode name_node = xmlDoc.SelectSingleNode(queryName + "/Query");

            List<string> xmlQuery = new List<string>();
            xmlQuery.Add(name_node.InnerText);

            // xml에서 파라미터값 가져오기
            XmlNode parameters = xmlDoc.SelectSingleNode(queryName + "/Parameters");

            if ( parameters != null && parameters.HasChildNodes==true)
            {
                XmlNodeList parameterList = parameters.ChildNodes;

                foreach (XmlNode parameter in parameterList)
                {
                    //파라미터 이름 가져오기 
                    string paramName = parameter.Name;

                    //파라미터 값 가져오기 
                    string paramValue = parameter.InnerText;

                    xmlQuery.Add(paramName);
                    xmlQuery.Add(paramValue);
                }
            }

            return xmlQuery;

 

xml에서 쿼리 + 파라미터를 다 가져와야하는데, 메서드를 두개 만들자니 받아오는 파라미터 값이 같아서 한 메서드에서 모두 받아올 수 있도록 구현하고 싶었다.  배열을 쓰자니 너무 많이 갈아엎어야 해서 List를 사용했다. 

List에서 가장 첫 번째 인덱스인 0에는 쿼리를 담아주고, 그 위 파라미터 명과 값을 차례대로 넣어줬다.
그리고 파라미터는 파라미터 태그가 있는것만 가져오고, 없으면 뛰어넘어가야했음.

if문에 parameters.ChildNodes == true 로 했더니 자꾸 오류가 나서 챗gpt에게 물어봤더니 그 바로 윗줄 parameters 변수가 null인경우도 체크 해 주어야한다그래서 if문에 parameters != null을 추가 해 주었다.

 

- 리턴값을 받은 클래스파일 

            try
            {
                #region [Oracle 연결]
                using (_connection = new OracleConnection(oradb))
                {
                    //sql 실행 
                    _connection.Open();

                    //sql문 실행 
                    OracleCommand cmd = query.connectionDB(xmlQuery[0], _connection);

                    if (1 < xmlQuery.Count)
                    {
                        for(int i=1; i< xmlQuery.Count; )
                        {
                            cmd.Parameters.Add(new OracleParameter(xmlQuery[i], xmlQuery[i + 1]));
                            i += 2;
                        }
                    }

 

- List에서 고정적으로 쿼리는 반드시 들어가기때문에 쿼리는 리스트의 인덱스 0번을 넣어준다.

- 파라미터를 넣는 함수는 cmd.Parameters.Add(new OracleParameter ( "파라미터이름", 파라미터 값) ; 의 형태로 사용 해 주는데, 

그 다음 부터는 파라미터이름, 파라미터값, 이름, 값, 이름, 값 ... 이 반복되기 때문에 for문 의 i를 1부터 시작하고, new OracleParameter( 리스트[i], 리스트[i+1] ) 로 가져온 뒤 i의 증가값을 2씩 설정 해 주었다.

 

728x90