아~~ 드뎌 3번째 입니다. 일단의 마의 3 번째를 넘었는데... 내용이 너무 허접하여 계속 이끌어갈수 있을지... ^^;;;
하이간 한번 끝까지 해볼랍니다. ^^
 
오늘은 XML Parsing에 대해 알아보도록 할까요?
Parsing이라 함은 간단히 Reading이라고 생각하시면 될 듯 합니다.
하지만 단순한 죽죽 읽어 내려가는 작업이 아닌 문서내에서 어떤 특정 데이터값을 찾는 다거나 특정 값과 관련된 일정 범위의 값들을 필터링하는 작업을 할수도 있고 XML 문서의 원하는 node를 찾아 내고 특정 element의 attribute 의 값을 찾아내는 일련을 작업을 말합니다.
그 밖에 Node type으로 리스트를 만들 수 있습니다.
Node를 Sort 할 수 있습니다.
XML Source 내에 있는 chile element들의 리스트를 만들 수 있습니다.
관련된 Node를 찾을 수 있습니다.
 
Parsing이 어떤 작업인지는 어련풋이 감을 잡으셨으리라 생각합니다.
 
그러면 XML Parsing Model에 대해서 알아볼까요?
크게 두가지 모델이 있다고 합니다.
그 것은 Push model과 Pull model 입니다.
Push model은 말 그대로 XML parsing 을 담당하는 객체가 데이터를 application에게 밀어 넣어주는 개념이라고 보시면 되고 이 모델은 SAX에서 사용하고 있습니다.
Pull model은 .NET Framework XML Reader가 채택하고 있는 모델로 application이Parsing 객체에 접근하여 데이터를 당겨오는 방식이라고 생각하시면 됩니다.
 
Push model은 xml data를 요청하는 application에게 filtering없이 처음부터 끝까지 주~~욱 데이터를 밀어 넣어 줍니다. 그래서 만약에 중간에 xml 파일이 well form이 아니거나 하면 걍 확 작업을 멈춰버리죠. 그래서 프로그래밍 시에 언제, 어떤 에러가 발생할지 모르니까 다양한 상황에 따른 error 처리를 해주어야 할 것입니다.
.NET에서는 SAX를 지원하지 않습니다.
하지만 .NET Based program에서 MSXML Parser 를 사용하는 방법으로 SAX방식을 구현할 수 는 있겠죠…
 
pull model같은 경우는 전에 말한 바와 같이 application이 parser에게 특정 node를 저정해주면 parser 는 xml source에서 그 node의 데이터만 가져오고 application은 그 가져온 데이터를 당겨 (pull) 옵니다.
.NET Framework 의 XmlReader class는 한번에 하나의 node만 읽습니다. 그리고 읽은 후에는 application에 읽었다는 notification은 날릴 뿐입니다.(야~~ 나 읽었어..라고요..^^)
만약에 xmlreader가 error를 만나면 야도 SAX와 같이 error를 발생시킵니다.
근데 SAX랑 약간 다른 점이 있다면 error를 만나도 하던 작업을 계속 진행합니다.
그게 다른 점이죠…
 
 
XmlReader에는 두가지 장점이 있는데 그 중하나는 coding이 쉽다는 점입니다.
우리가 datareader 객체의 read 함수를 사용해서 Looping 을 돌려 데이터를 가죠오듯이 쉽게 데이터를 가져올 수 있습니다.
Push model에서는 state 를 handle하는 routine리라는 걸 사용한다고 하네요…
글구 그런 routine을 사용하는 것보다 훨씬 쉽다고 합니다.(SAX를 사용해 보질 않아서.. ^^;)
글구 두번째는 XmlReader는 SAX보다는 적은 memory를 사용하기 때문에 수행면에서 더낫다는 것입니다.
그리고 전에도 이야기 했듯이. SAX는 내가 원하는 데이터를 찾기 위해서는 첫줄부터 마지막줄까지 일일이 한줄한줄 찾아 내려갑니다.
내가 원하는 데이터를 만날때까지.
그러나 Pulll model을 사용하는 XmlReader의 경우는 원하지 않는 element는 걍 넘어가 버리죠..
그러니 SAX보다는 빠르겠죠…
 
요약하면 이렇습니다.
상태관리(state management)면에서 push model의 경우는 context handler를 요구하지만
pull model 의 client는 상태관리가 단순하다고 하네요..(이 부분은 공부가 더 필요할 듯…ㅡㅡ;)
multiple input streams: pull model은 client가 파서에게 일을 준다고 해도 SAX보다는 덜 무리가 가겠죠..
 push model의 경우는 일을 받으면 데이터를 주~~욱 끝까지 읽으며 데이터를 가져와야지..
그리고 그 가져온걸 요청한 녀석에게 또 다 뿌려줘야지.. 할일이 억쓰로 많을 것입니다.
 
데이터를 가져오는 효율성을 보면 push model은 데이터를 두번 쓴다고 합니다.
Parser는 Xml 문서로부터 읽은 string 객체를 자신의 buffer에 한번 쓰고 다시 그걸 client의 buffer에 밀어 넣어 써주어야 한다고 하네요..
그래서 두번 쓴다고 합니다.
Pull model은 자신의 buffer에만 쓰면 되죠.. 그리고 client에게 notification만 날린다고 했죠. (야~ 다 읽었어! 라고.. ^^)
Push model은 원하는 데이터를 찾을 때 한줄 한줄 다 읽어 내려간다고 했죠. 각 item을 비롯해서 각 element 의 name, attribute 의 이름, 값, 공백까지..
다 읽어 내려간다고 합니다. 그러나 pull model 의 경우는 원하는 item 이 아닌 경우는 걍 skip 하고 뛰어 넘어 갈 수 있습니다. 그러니 push model 경우보다는 빠를 수 있다는 야그죠.
SAX가 Pull model 보다 나은 점에 대해서 예전에 들었었는데 기억이 가물가물해서 모르겠네요..
아시는 분께서는 알려주세요… ^^
그럼 다음 시간에는 XmlReader를 이용한 Parsing을 시작으로 Xml Parsing에 대해서 한번 주~욱 알아보죠…
 
긴 글 읽어 주셔서 감사합니다.
 
한주가 다시 시작됐습니다.
 
부디 행복한 한주 되시고
고수되십시요...
 
woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
작심삼일은 넘었으나.. 다시 작심삼일이 되지 않도록 기도해주세요... ^^;(작심삼일 되기전에 다시 마음을 먹었거든요..ㅋㅋㅋ)

반응형

'XML' 카테고리의 다른 글

[XML] AutomationML  (0) 2017.04.05
[XML] XML ??? ... (2)  (0) 2009.03.05
[XML] XML ??? ... (1)  (0) 2009.03.05

+ Recent posts