XML select

XmlDocument 에서 특정 XmlNode를 검색할 때, GetElementsByTagName 메소드 이외에 SelectNodes, SelectSingleNode 메소드로도 특정 노드를 찾을수 있다.

여기서, SelectNodes, SelectSingleNode 두 개의 메소에 대해서 설명하겟다.
SQL 구문에서 검색시 select 쿼리문을 이용하는데, 이름이 비슷하다.

SelectNodes, SelectSingle 특징

SelectNodes : 해당하는 XmlNodes 목록인 XmlNodeList를 반환한다.
SelectSingle :  해당하는 XmlNode를 반환한다.

다음을 list.xml  파일을 로딩해서 검색하는 예제이다.

list.xml

<?xml version="1.0" encoding="utf-8" ?>
<food_list>
<food ID="001" kind="한식" >
  <cook>한요리</cook>
  <name>김치</name>
</food>
<food ID="002" kind="일식">
  <cook>와마시따</cook>
  <name>초밥</name>
</food>
<food ID="003" kind="한식">
  <cook>김치국</cook>
  <name>추어탕</name>
</food>
</food_list>

 

using System;

using System.IO;

using System.Xml;

 

namespace xml

{

    class Program

    {

        static void Main()

        {

            string filePath = @"..\..\list.xml";

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(filePath);

 

            XmlNodeList xmlNode = xmlDoc.GetElementsByTagName("food");

            for (int i = 0; i < xmlNode.Count; i++)

            {

                //속성 출력

                XmlAttributeCollection xmlAttr = xmlNode[i].Attributes;

                for (int j = 0; j < xmlAttr.Count; j++)

                {

                    Console.Write(xmlAttr[j].Name);

                    Console.Write(": " + xmlAttr[j].Value + "\t\t");

                }

                Console.WriteLine("");

 

                //데이타 출력

                XmlElement data = (XmlElement)xmlNode[i].FirstChild;

                while (data != null)

                {

                    Console.Write(data.Name);

                    Console.WriteLine(":\t" + data.InnerText);

                    data = (XmlElement)data.NextSibling;

                }

                /*

                                XmlNodeList xmlChild = xmlNode[i].ChildNodes;

                                for (int k = 0; k < xmlChild.Count; k++)

                                {

                                    XmlElement data = (XmlElement)xmlChild[k];

                                    Console.Write(data.Name);

                                    Console.WriteLine(":\t" + data.InnerText);

                                }

                */

 

            }

 

            //SelectNodes 예제par             Console.WriteLine("\n---------------- SelectNodes 예제----------------");

            {

                XmlElement root = xmlDoc.DocumentElement;

                XmlNodeList nodeList = root.SelectNodes("/food_list/food/@kind");

                foreach (XmlNode food in nodeList)

                    Console.WriteLine(food.Value);

            }

            //SelectNodes 예제par             {

                Console.WriteLine("\n---------------- SelectNodes 예제----------------");

                XmlElement root = xmlDoc.DocumentElement;

                XmlNodeList nodeList = root.SelectNodes("/food_list/food");

                foreach (XmlNode food in nodeList)

                    Console.WriteLine(food.OuterXml);

            }

            //SelectSingleNode 예제

            {

                Console.WriteLine("\n---------------- SelectSingleNode 예제 ----------------");

                XmlNode food = xmlDoc.SelectSingleNode("descendant::food[@ID='003' and @kind='한식']");

                Console.WriteLine(food.OuterXml);

            }

        }

    }

}

- SelectNodes 예제1
검색 쿼리:   /food_list/food/@kind
설명: food_list 하위에 존재하는 food의 kind Attribute , @는 Attribute을 의미한다.

- SelectNodes 예제2
검색 쿼리 :  /food_list/food
설명 : food_list 하위에 존재하는 food의 리스트

- SelectSingleNode 예제
검색 쿼리 :  descendant::food[@ID='003' and @kind='한식']
설명 : food의 하위에 존재하는 ID Attribute가 003이고 kind Attribute가 한식

- 실행 결과

ID: 001         kind: 한식
cook:   한요리
name:   김치
ID: 002         kind: 일식
cook:   와마시따
name:   초밥
ID: 003         kind: 한식
cook:   김치국
name:   추어탕

---------------- SelectNodes 예제1 ----------------
한식
일식
한식 

---------------- SelectNodes 예제2 ----------------
<food ID="001" kind="한식"><cook>한요리</cook><name>김치</name></food>
<food ID="002" kind="일식"><cook>와마시따</cook><name>초밥</name></food>
<food ID="003" kind="한식"><cook>김치국</cook><name>추어탕</name></food>

---------------- SelectSingleNode 예제 ----------------
<food ID="003" kind="한식"><cook>김치국</cook><name>추어탕</name></food>

 

 

소스 : xml_select.zip