XML.NET (1/2) XML 검증, 검색, 수정 프로그램 작성 2008 컴퓨터공학실험(Ⅰ) 4주 실습강의 XML.NET (1/2) XML 검증, 검색, 수정 프로그램 작성 2008 컴퓨터공학실험(Ⅰ)
Markup Language markup language Markup Language 대표적인 Markup Language 문서 처리를 지원하기 위해 문서에 추가되는 정보 language 정의된 구문과 문법을 따르는 기호의 집합 Markup Language markup 정보를 표현하는 언어 meta data (다른 데이터 집합에 대한 정보)를 전달하는 언어 대표적인 Markup Language SGML (Standard Generalized Markup Language) HTML (Hypertext Markup Language) XML (Extensible Markup Language) XHTML (Extensible Hypertext Markup Language)
HTML (Hypertext Markup Language) 웹 문서를 만들기 위하여 사용하는 프로그래밍 언어 웹에서 전송 네트워크로서 메시지를 송수신하는 역할을 수행 문서의 다른 여러 타입을 정의하기에는 부적절 HTML을 사용해서 표현하기에 부적절한 문서의 예 널리 사용되는 구성 요소로 구성되어있지 않은 문서 ex) 악보 기호, 수학 방정식 책의 목록과 같은 데이터베이스 트리 같은 계층 구조로 정렬하기 원하는 문서
XML 개발 배경 예) HTML 페이지에서 테이블로 표현된 데이터의 정렬 순서 변경 시.
XML 개발 배경 HTML 파일에는 데이터와 표현 논리가 혼재해 있기 때문에 브라우저가 데이터만을 추출해서 처리할 수 없다. 표현 정보가 배제된 데이터만을 전달 할 수 있다. 데이터를 표현 정보로부터 분리해 내는 것이 XML 개발 핵심 이유. 표현 정보는 ‘스타일시트’라는 이름으로 관리.
The design goals for XML XML은 SGML과 호환성이 있어야 한다. XML 문서들을 처리하는 프로그램의 작성이 쉽도록 한다. XML에서의 선택적 특성을 최소화 한다. XML 문서들은 사람이 이해하기 쉽고 명확해야 한다. XML 설계는 신속히 준비되어야 한다. XML의 설계는 간결하고 형식을 갖추도록 한다. XML 문서는 생성하기 쉽도록 한다. XML Markup의 간결함은 중요하게 다루지 않는다. http://www.w3.org/TR/REC-xml/
XML 문서의 구조
XML DOM (Document Object Model) XML 파싱을 위한 객체로는 대표적으로 DOM과 SAX(Simple API for XML)을 들 수 있겠습니다. DOM이 모든 노드를 메모리에 적재하고 자유롭게 탐색/순회하는 스타일인 반면에, SAX를 사용하면 일괄적인 XML파일 처리에 유용하게 사용할 수 있는 스타일을 가지고 있습니다. 규모가 커질수록 SAX가 유리한 반면, 처리/탐색에 있어서 일정부분 DOM보다 자유롭지 못 한 부분이 있습니다. 이번 실험에 사용되는 클래스들은 기본적으로 DOM 객체를 구현한 XmlDocument를 사용하게 될 것입니다.
XPath XPath란 무엇인가? XPath Expression Path Expression Description / XPath는 XML 문서의 part를 정의하기 위한 syntax이다. XPath는 XML 문서 내부를 검색하기 위한 path expression을 사용한다. XPath Expression Path Expression Description / Root node로부터 선택 @ Attribute 선택 /order/date Order의 자식 중 date 선택 /order/[@num =‘312597’] num 속성 값이 312597 인 order 선택 … XPath는 XSLT와 XPointer에 사용될 것을 고려해서 디자인 되었습니다. 첫 번째로는, Xpath를 XML의 각 부분을 가리키는 용도로 사용됩니다. 이에 따라 당연히(?) 문자열이나 숫자, Boolean 등을 다룰 수 있는 기본적인 것들을 함수 형태로 제공합니다. draft 당시에는 가볍고, XML과 상관없는 구문을 선택하였습니다만, 단순히 주소로만 사용하는 가벼운 표현식에서 조금 벗어나면 상당한 어려움을 가질 수도 있습니다. (마치 정규 표현식(Regular Expression)이 그랬던 것 처럼요. 일례로, XPath로 namespace가 정의된 XML 문서를 제대로 조작하려면 상당한 시간을 들여야 합니다. http://msdn2.microsoft.com/en-us/library/ms950779.aspx 를 참고하시면 도움이 될 듯 합니다.) 1.0의 Specification : http://www.w3.org/TR/xpath 지금은 1.0 발표 당시의 개념에서 한 걸음 더 나아가 XPath Data Model/XQuery 의 개념을 도입, XSLT 2.0 및 XQuery내에서 사용할 수 있습니다. 2.0의 Specification : http://www.w3.org/TR/xpath20/ MSDN에서 설명하고 있는 XPath 구문을 참조하면 도움이 될 듯 합니다. http://msdn2.microsoft.com/ko-kr/library/ms256115(VS.80).aspx 한국어 위키백과의 XPath 페이지도 예제를 보기엔 도움이 될 껍니다. http://ko.wikipedia.org/wiki/XPath
XML 문서 만들기(1/2)
XML 문서 만들기(2/2) <?xml version='1.0'?> <!-- File Name: books.xml --> <bookstore> <book genre="autobiography"> <title>The Autobiography of Benjamin Franklin</title> <author> <first-name>Benjamin</first-name> <last-name>Franklin</last-name> </author> <price>8.99</price> </book> <book genre="novel"> <title>The Confidence Man</title> <first-name>Herman</first-name> <last-name>Melville</last-name> <price>11.99</price> </bookstore> 이번 실험에 사용될 XML 파일에는 XPath 접근 편의를 위해, Namespace를 생략하였습니다. XSD(XML Schema Definition)을 통해 Strict한 XML 문서 검증을 위해서는 각각의 엘리먼트에, xmlns=“” 라는 속성을 사용하여 Namespace를 지정해줘야 합니다.
XmlDocument Class 다른 의미로 DOM 객체라고 생각하면 됨 XML 문서에 대한 트리를 만들어 줌 LoadXml – 지정된 문자열에서 XML 문서를 load 함 SelectNodes – Xpath식과 일치하는 node의 목록 선택 CreateElement – 엘리먼트의 생성 XmlDocument XmlNode XmlElement XmlAttribute
XmlNodeList Class XmlDocument.SelectNodes() 를 통해 XmlNodeList 인스턴스가 반환 됨 인스턴스 메서드 / 속성 Count : 노드의 개수를 가리키는 속성 Item(index) : 특정 인덱스에서 노드를 검색 Index는 노드 목록에 대한, 0부터 시작하는 인덱스 이 메서드는 XmlNode를 반환하고, 각각의 XmlNode는 Name과 Value 속성을 가짐 XmlNode는 명시적 타입 캐스팅을 통해 XmlElement 클래스 타입으로 전환 가능 XmlNodeList 클래스에 대한 자세한 설명은 아래의 MSDN을 참조하시길 바랍니다. http://msdn2.microsoft.com/ko-kr/library/system.xml.xmlnodelist(VS.80).aspx XmlElement 클래스에 대한 자세한 설명은 아래의 MSDN을 참조하시길 바랍니다. http://msdn2.microsoft.com/en-us/library/system.xml.xmlelement(VS.80).aspx 개발자의 선택에 따라, XmlDocument.SelectNodes() 말고도, XPathNavigator 클래스와 그 인스턴스 메서드인 Select()를 사용하여 개발 할 수도 있습니다. XmlDocument의 인스턴스에서 메서드 CreateNavigator() 를 사용하면, 해당 XML Document와 연결된 XPathNavigator의 인스턴스를 얻을 수 있습니다. XPathNavigator에 대한 자세한 설명은 아래의 두 링크를 참조하면 도움이 될 것입니다. MS KB308343(한국어): http://support.microsoft.com/kb/308343 최영관 – 소설같은 C# 14장: http://www.jabook.org/jabook/csharp/CsharpLecture14%5C10000_10000_240000__10000_10000_240000.html
System.IO Namespace: Stream* Classes if(!IsPostBack) { System.IO.StreamReader sr; sr = new System.IO.StreamReader(Server.MapPath("books.xsd"), System.Text.Encoding.UTF8); TextBoxDtd.Text = sr.ReadToEnd(); sr.Close(); sr = new System.IO.StreamReader(Server.MapPath("books.xml"), System.Text.Encoding.UTF8); TextBoxXml.Text = sr.ReadToEnd(); } IsPostBack 클라이언트에서 이 페이지가 처음으로 로드되어 엑세스 되는지의 여부를 나타내는 값 StreamReader 특정 인코딩의 바이트 스트림에서 문자를 읽는 TextReader
Implementation Guidelines Element / Attribute 추가, 삭제 버튼을 누를 경우 처리 XPath 구문으로 추가할 노드의 위치를 파악하고 추가는 AppendChild() / SetAttribute() 메서드로? XPath 구문으로 삭제할 노드의 위치를 파악. 여러 개의 노드가 선택되면 어떻게 해야 할 것인가? XPath를 입력 하여 검색 버튼을 누를 경우 출력 XmlDocument.SelectNodes() Method 여러 개의 노드가 선택될 경우 어떻게 표현할 것인가? 순차로 보여줄 것인가? 허용하지 않을 것인가? 페이지가 화면에 표시 될 시점에 해야 할 일 Page_Load() 메서드 세부구현 XmlDocument 내의 문서가 바뀌면 어떻게 표현할 것인가?