본문 바로가기

   
Programming/XML

루트, Predicate, SelectSingleNode

반응형

<주소록>

       <회원 번호="1">

             <이름>홍길동</이름>

             <나이>20</나이>

             <전화번호>010-3333-4444</전화번호>

             <주소>

                    <우편번호>110-111</우편번호>

                    <상세주소>서울시 영등포구</상세주소>

             </주소>

       </회원>

       <회원 번호="2">

             <이름>아무게</이름>

             <나이>25</나이>

             <전화번호>010-555-4554</전화번호>

             <주소>

                    <우편번호>120-222</우편번호>

                    <상세주소>서울시 서대문구</상세주소>

             </주소>

       </회원>

       <회원 번호="3">

             <이름>테스트</이름>

             <나이>30</나이>

             <전화번호>010-555-4554</전화번호>

             <주소>

                    <우편번호>120-222</우편번호>

                    <상세주소>서울시 서대문구</상세주소>

             </주소>

       </회원>

       <회원 번호="4">

             <이름>이순신</이름>

             <나이>28</나이>

             <전화번호>010-555-4554</전화번호>

             <주소>

                    <우편번호>120-222</우편번호>

                    <상세주소>서울시 서대문구</상세주소>

             </주소>

       </회원>

       <회원 번호="5">

             <이름>하하하</이름>

             <나이>21</나이>

             <전화번호>010-555-4554</전화번호>

             <주소>

                    <우편번호>120-222</우편번호>

                    <상세주소>서울시 서대문구</상세주소>

             </주소>

       </회원>

</주소록>

 




using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml; //@@@@

 

namespace ConsoleEx

{

       class Ex18_XPath

       {

             static void Main(string[] args)

             {

                    //XPath

                    //     - XML문서내에서 원하는 노드를 찾기 위한 탐색 언어

 

                    // Axis + NodeTest + Predicate

 

                    //NodeTest

                    //(1) / 

                    //     - 루트

                    //     - /주소록/회원/이름

                    //     - 절대경로

 

                    //(2) .

                    //     - 상대경로

                    //     - 회원/이름

                    //     - ./회원/이름

 

                    //(3) ..

                    //     - 상대경로

                    //     - 부모노드

                    //     - ../노드명/노드명/../노드명

 

                    //(4) //

                    //     - 문서 전체를 대상으로 검색

                    //     - //이름 : 부모자식 상관없이 엘리먼트명이 "이름"인 노드를 모두 변환

 

                    //(5) @속성명

                    //     - 속성

                    //     - /주소록/회원/@번호        ; 속성도 자식취릅을 하므로 \ 붙임

 

                    //(6) //@속성명

                    //     - //@번호 : 부모자식, 어떤 엘리먼트에 속한 속성이던지 상관없이 속성명만 "번호"이면 모두 반환

 

                    //Predicate

                    //(1) //회원[이름]

                    //     - 모든 "회원" 엘리먼트 중에서.. 자식 엘리먼트로 "이름"이라는 자식을 갖는 회원...

                    //     - 자식의 유무를 조건**

 

                    //(2) //회원[@번호]

                    //     - 모든 "회원" 엘리먼트 중에서.. "번호"라는 속성을 갖는 회원만...

                    //     -ex) //div[@class]

 

                    //(3) //회원[이름='홍길동']

                    //     - 회원 중 자식(이름) PCDATA가 홍길동인 회원

 

                    //(4) //회원[@번호='2']

                    //     - 회원 중 자식(속성) CDATA값이 2인 회원

 

                    //(5-1) //회원[나이 > 20]

                    //(5-2) //회원[@번호 < 3]

                    //     - 기본적인 연산자 지원

 

                    //(6-1) //나이[. > 25]   ; 나이[나이 > 25] 의 뜻이다..본인은 점(.) 으로 표현

                    //(6-2) //@번호[. = 2]   ; 속성도 자기 자신은 점(.)

 

                    //(7-1) //회원[@번호 = 2]/이름/text() ; 회원번호가 2인 사람의 이름 엘리먼트의 PCDATA 반환

                    //(7-2) //이름 : 이름 엘리먼트 배열 반환

                    //(7-3) //이름/text() : 이름 문자열 배열 반환

 

                    //(8) //회원[position() = 2]

                    //     - 모든 회원 중 2번째 회원 반환

 

                    XmlDocument doc = new XmlDocument();

                    doc.Load(@"..\..\address.xml");

 

 

                    //문서상의 모든 "이름" 을 출력

                    //1. dom 방식

                    XmlElement root = doc.DocumentElement;

                    XmlNodeList ms = root.ChildNodes;//<회원> 태그들의 집합

                    foreach (XmlElement m in ms)

                    {

                           //<회원>의 첫번째 자식 = <이름>

                           Console.WriteLine(m.FirstChild.InnerText);

                    }

 

                    Console.Clear();

 

                    //2. XPath 방식

                    //doc.SelectNodes("//이름");

                    //XmlNodeList ms2 = doc.SelectNodes("//이름");

                    XmlNodeList ms2 = doc.SelectNodes("//회원[나이 > 25]/이름");// 나이가 25 넘는 사람의 이름만 반환

 

                    foreach (XmlElement m in ms2)

                    {

                           //위와는 다르게 여기서 m은 자체가 이름이다.

                           Console.WriteLine(m.InnerText);

                    }

 

                    Console.Clear();

                    //문제:이름이 테스트인놈의 상세주소

                    //모든 이름(자기자신)이 테스트인놈의 상세주소. 그러나 이름과 주소는 형제관계임에 주의

                    XmlNodeList result = doc.SelectNodes("//이름[.='테스트']/../주소/상세주소");

                    foreach (XmlElement item in result)

                    {

                           //<상세주소>

                           Console.WriteLine(item.InnerText);                         

                    }

                    Console.Clear();

 

                    //위의 컬렉션들과는 다르게 아래는 단일값 반환

                    //foreach 문은 자동으로 형변환을 시켜주지만, 아래와같이하면 형변환까지도 해줘야 함.

                    XmlElement address = doc.SelectSingleNode("//이름[.='테스트']/../주소/상세주소") as XmlElement;

                    Console.WriteLine(address.InnerText);

 

 

             }

       }

}

 

 





 using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml; //@@@@

 

namespace ConsoleEx

{

       class Ex19_XPath

       {

             static void Main(string[] args)

             {

                    XmlDocument doc = new XmlDocument();

                    //블로그의 rss 단추를 누른수 다음의 주소를 붙여넣기

                    doc.Load("http://petit_ange.blog.me/rss");

                    //Console.WriteLine(doc.OuterXml);

 

                    //포스트 제목 출력

            

                    //item 엘리먼트의 자식으로  title를 갖는놈들만

                    XmlNodeList list = doc.SelectNodes("//item/title");

                    foreach (XmlElement item in list)

                    {

                           Console.WriteLine(item.InnerText);

                    }

             }

 

       }

}

 

 

반응형