Parser 와 DOM 기초
- Parser
- XML 문서를 읽고 해석 : well-formed, valid 검사
- 응용 개발시 파서 사용 이유 : 세부적인 XML 문법으로부터 프로그램 격리
XML 문서 --> [파서] -->인터페이스--> [응용 프로그램]- 파서가 메모리에 DOM 트리를 생성 : XML 문서트리와 일치
- 파서가 메모리에 DOM 트리를 생성 : XML 문서트리와 일치
- 표준 API
- DOM : 객체 기반 (Object-based) Interface
- 메모리 상주 트리 이용, 응용에서 간단히 사용, p.208 - SAX : 이벤트 기반 (Event-driven) Interface
- 파서가 간단, 응용프로그램은 복잡
- DOM : 객체 기반 (Object-based) Interface
- DOM 개요
- 문서내 객체(element)를 조작하기 위한 인터페이스(API)
- DOM level 1 : ’98.10 W3C Recommendation
- DOM level 2 : 2000.11 W3C Recommendation
- DOM level 3 : 2001.8 W3C Working Draft- 문서 전체가 아닌 문서 일부분에 대한 접근 가능
- 대상 문서 : XML1.0 또는 HTML4.0
- DOM의 역할
- 구조의 탐색 : 각 요소와 속성에 대한 탐색/질의가 가능
- 문서 구조의 조작 : 문서 구조에서 요소, 속성의 추가/수정/삭제가 가능
- 컨텐츠의 조작 : 문서 요소에서 text 등 컨텐츠의 탐색/추가/수정/삭제가 가능
- 문서내 객체(element)를 조작하기 위한 인터페이스(API)
Document 객체
- DOMDocument 객체 생성 및 읽기
- Msxml2.DOMDocument 객체
- async 속성, load 메쏘드, xml 속성
MSXML 파서 설치할 경우 MSXML 파서 설치안한 경우 <HTML>
<HEAD>
<Script language="Javascript">
function xload0()
{
var xmldoc = new
ActiveXObject("Msxml2.DOMDocument");
xmldoc.async = false; xmldoc.load("ex07a.xml");
alert(xmldoc.xml);
}
</script>
</HEAD>
<BODY>
<input type="button" value="XML 로드0"
onClick="xload0()">
</BODY>
</HTML>
111 <HTML>
<HEAD>
<Script language="Javascript">
function xload1()
{
xmldoc.async = false;
xmldoc.load("ex07a.xml");
alert(xmldoc.xml);
}
</script>
</HEAD>
<BODY>
<input type="button" value="XML 로드1"
onClick="xload1()">
<xml id="xmldoc"></xml>
</BODY>
</HTML>
VBScript 의 경우 <Script language="VbScript">
Dim xmldoc
Set xmldoc = CreateObject("Msxml2.DOMDocument")
xmldoc.async = False;
xmldoc.load("ex07a.xml");
MsgBox xmldoc.xml
</Script>
- 신규 문서 작성 : loadXML 메쏘드
xmldoc.async = false;
xmldoc.loadXML( "<book><title>XML 입문</title><author>일지매</author></book>");
alert(xmldoc.xml);
xmldoc.async = false;
xmldoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </author> </book>");
alert(xmldoc.xml);
- 공백의 처리 : preserveWhiteSpace 속성
xmldoc.async = false;
xmldoc.preserveWhiteSpace = true;
xmldoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </author> </book>");
alert(xmldoc.xml);
xmldoc.async = false;
xmldoc.preserveWhiteSpace = true;
xmldoc.load("ex07a.xml");
alert(xmldoc.xml);
- XML 문서의 저장 : save 메쏘드
- 에러 처리 : parseError, parseError.line, parseError.linepos, parseError.reason
xmldoc.async = false;
xmldoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </authors> </book>");
alert(xmldoc.xml);
xmldoc.async = false;
xmldoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </authors> </book>");
if (xmldoc.parseError)
alert("에러 위치 : " + xmldoc.parseError.line + "번째 라인 " + xmldoc.parseError.linepos
+ "번째 문자\n\n에러 이유 : " + xmldoc.parseError.reason);
else alert(xmldoc.xml);
- 루트 노드 찾기 : documentElement 속성
xmldoc.async = false;
xmldoc.load("ex07a.xml");
var xmlroot = xmldoc.documentElement;
alert(xmlroot.nodeName);
xmldoc.async = false;
xmldoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </author> </book>");
var xmlroot = xmldoc.documentElement;
alert(xmlroot.nodeName);
- 임의의 노드 찾기 : getElementsByTagName("tagName")
- 노드의 추가 메쏘드 : 뒤에 설명
- createElement(name), createTextNode(data), createAttribute(name), createComment(data), createProcessingInstruction(target,data), createCDATASection(data), createEntityReference(name)
Node 객체
- nodeName, nodeType, nodeValue, attributes, text 속성
- nodeType = 1(element), 2(attribute), 3(text) , 4(CDATA), ... : 표7.1 [p.215]
xmldoc.load("ex07a.xml");
var xmlroot = xmldoc.documentElement;
alert('nodeName: '+xmlroot.nodeName+'\nnodeType: '+xmlroot.nodeType+
'\nnodeValue: '+xmlroot.nodeValue+'\nattributes: '+xmlroot.attributes.length);
alert(xmlroot.text);
- Node의 운행(Traversal) 관련 속성
- 관련속성
-- previousSibling
... parentNode -- **현재노드** -- childNodes [ firstChild, … , lastChild ]
-- nextSibling - hasChildNodes() 메쏘드
- 관련속성
- NodeList 객체
- length 속성, item(번호) 메쏘드
xmldoc.load("ex07a.xml"); var xmlroot = xmldoc.documentElement; if (xmlroot.hasChildNodes) { alert(xmlroot.childNodes.length); var curr = xmlroot.firstChild; alert(curr.xml); alert(curr.nodeName + curr.nodeType +curr.nodeValue+curr.attributes.length); } else alert('No Child'); |
xmldoc.load("ex07a.xml"); var xmlroot = xmldoc.documentElement; var curr = xmlroot.firstChild.nextSibling; alert(curr.xml); curr = curr.childNodes.item(2); alert(curr.xml); curr = curr.previousSibling; alert(curr.text); alert(curr.nodeName + curr.nodeType +curr.nodeValue+curr.attributes.length); |
- NamedNodeMap 객체
- getNamedItem("속성명"), setNamedItem(), removeNamedItem() 메쏘드
- Attribute 객체
- name, value, specified 속성
xmldoc.load("ex07a.xml");
var attrs = xmlroot.firstChild.attributes;
var attr0 = attrs.getNamedItem("InStock");
alert(attr0.name + attr0.value + attr0.specified);
- 노드의 추가/삭제/수정 메쏘드 : 뒤에 설명
- appendChild(child), insertBefore(child,before), removeChild(child),
replaceChild(child,toReplace), cloneNode(deep)
- appendChild(child), insertBefore(child,before), removeChild(child),
임의 노드의 검색
- 태그 이름으로 검색
- 노드리스트 = 문서.getElementsByTagName("tagName");
xmldoc.load("ex07a.xml"); var nlist = xmldoc.getElementsByTagName("book"); for (i=0; i<nlist.length; i++) alert(nlist.item(i).xml); |
xmldoc.load("ex07a.xml"); var nlist = xmldoc.getElementsByTagName("title"); for (i=0; i<nlist.length; i++) alert(nlist.item(i).xml); |
- 패턴으로 검색
- 노드리스트 = 노드.selectNode("query");
- 노드 = 노드.selectSingleNode("query");
xmldoc.load("ex07a.xml"); var xroot = xmldoc.documentElement; var node1 = xroot.selectSingleNode("title"); alert(node1.text); var tlist = xroot.selectNodes('//title'); var alist = xroot.selectNodes('//author'); for (i=0; i<alist.length; i++) alert('['+i+'] '+alist.item(i).text+', ' +tlist.item(i).text); |
xmldoc.load("ex07a.xml"); var xroot = xmldoc.documentElement; var node1 = xroot. selectSingleNode('//book[@InStock=0]'); alert(node1.xml+'\n=> 재고가 없습니다.'); var tlist = xroot. selectNodes('//book[@InStock!=0]/title'); for (i=0; i<tlist.length; i++) alert(tlist.item(i).text+'\n=>재고 있음.'); |
펌 - http://mm.sookmyung.ac.kr/~sblim/lec/xml-int02/
MSDN - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/dom_reference.asp