<주소록>
<회원 번호="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);
}
}
}
}