using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;//C#에서 XML을 다룰수 있도록하는 조작 클래스들이 있음.
namespace ConsoleEx
{
class Ex14_DOM
{
static void Main(string[] args)
{
//DOM(Document Object Model)
// - Javascript DOM : 브라우저에서
// - C# DOM : 브라우저를 제외한 윈폼, 웹폼, 서비스....
//C#으로 XML 조작
// 1. SAX(StreamReader ... 방식)
// 2. DOM
//DOM 처리순서
// 1. 문서를 읽기(문서 전체를 한번에...)
// 2. 문서내의 구성요소(엘리먼트, 속성, PCDATA, 엔티티, 주석, 처리지시문 등..)을 객체로 생성해서
// 부모자식 관계를 형성시킨다.(트리구조를 만듦) ************************
// 3. 메모리상의 트리구조를 통해서 원하는 요소에 접근, 조작(읽기, 수정, 삭제, 추가 등...)
//DOM의 장점
// 1. 조작 편함
// 2. 원하는 노드 접근 용이
// 3. 속도 빠름
// 4. 같은 요소를 반복해서 접근해도 용이함..
// 5. XPath지원(XML 검색 언어)
//DOM 단점
// 1. 무거움(문서 전체를 Object화 로드...)
//address.xml 읽기
// 1. 문서 매핑 객체 생성(문서와 동등한 역할 객체)
// - 실제 xml를 총괄
// - 문서의 구조를 조작(생성, 삭제)
XmlDocument doc = new XmlDocument();
// 2. 읽기(전체) **********
// 경로: 부모폴더의 부모폴더로 이동
doc.Load(@"..\..\address.xml");
// 3. 조작
// OuterXml : 현재 객체를 포함해서 자식들이 가지고 있는 모든 Xml 코드를 문자열로 반환
// InnerXml : 현재 객체를 포함하지 않고 자식들이 가지고 있는 모든 Xml 코드를 문자열로 반환
//Console.WriteLine(doc.OuterXml);
Console.WriteLine(doc.InnerXml);
}
}
}
2번째 DOM
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml; //@@@
namespace ConsoleEx
{
class Ex15_DOM
{
static void Main(string[] args)
{
//DOM -> (조건)미리 XML파일의 구조와 의미 파악
//0. 파일에서 읽어와서 객체 doc에 저장
XmlDocument doc = new XmlDocument();
doc.Load(@"..\..\address.xml");
//기본 클래스
// 1. 엘리먼트(태그) -> XmlElement
// 2. 속성 -> XmlAttribute
// 3. PCDATA -> XmlText
// 4. 주석 -> XmlComment
// 5. XmlNode -> object와 비슷함. 대부분의 부모 클래스 역할을 함(XmlElement, XmlText로 다운캐스팅 해야 함)
//1. 문서의 루트 엘리먼트 저장(그러나, 하위의 모든 엘리먼트들도 가지고 있다.)
XmlElement root = doc.DocumentElement;
Console.WriteLine(root.Name);//최상위 "주소록" 엘리먼트명 출력
//2. 자식 엘리먼트 접근
// - firstChild. lastChild, childNodes
//XmlNode m1 = root.ChildNodes[0];
XmlElement m1 = (XmlElement)root.ChildNodes[0]; //회원
Console.WriteLine(m1.Name);
//Console.WriteLine(m1.OuterXml);
//3. 첫번째 자식에 접근
//XmlElement name = (XmlElement)m1.ChildNodes[0];
XmlElement name = (XmlElement)m1.FirstChild;//이름
Console.WriteLine(name.Name);
//3. PCDATA에 접근 방법1
Console.WriteLine(name.InnerText);
//3. PCDATA에 접근 방법2; 위와 같은 결과.
XmlText txt = (XmlText)name.FirstChild;
Console.WriteLine(txt.Value);// 이럴때는 txt도 엘리멘트로 보기때문에innetText대신에 .Value도 됨
//1번째 자식
//m1.ChildNodes[i]
//1번째 자식
//m1.FirstChild
//막내자식
//m1.LastChild
Console.WriteLine();
//형제 NextSibling;다음형제 PreviousSibling;이전형제
//XmlElement m2 = root.ChildNodes[1] as XmlElement;
XmlElement m2 = m1.NextSibling as XmlElement;
Console.WriteLine(m2.FirstChild.InnerText);
//m2.PreviousSibling //이전형제
//부모
XmlElement 주소록 = m1.ParentNode as XmlElement;
Console.WriteLine(주소록.Name);
}
}
}