Earn this, Earn it.

TIL - XML Parser 본문

[개발 공부]

TIL - XML Parser

Narastro 2021. 9. 21. 14:19
2021년 7월 26일 글

 

🚀 XML Parser

XML ?

XML(eXtensible Markup Language)은 W3C에서 개발된, 다른 특수한 목적을 갖는 마크업 언어를 만드는데 사용하도록 권장하는 다목적 마크업 언어이다. 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있도록 하여 HTML의 한계를 극복할 목적으로 만들어졌다. (출처:https://ko.wikipedia.org/wiki/XML)

파싱(Parsing) ?

일련의 문자열을 의미 있는 토근 단위로 분해하고 이를 AST로 변환하는 과정을 말한다. 이러한 과정을 수행하는 Parser로 크게 tokenizer, lexer, parser가 있다.

간단히 살펴보면 tokenizer는 입력값을 알맞은 토큰 단위로 나눠주는 역할,
lexer는 나눠진 토큰들을 분석해 의미를 부여하는 역할,
parser는 분석된 토큰들을 문법적으로 검사해 파스 트리로 만들어주는 역할을 한다.

token ?

프로그래밍 언어에서의 token은 문법적으로 더 이상 나눌 수 없는 기본적인 언어요소를 말한다. 예를 들어 하나의 키워드나 연산자 또는 구두점 등이 토큰이 될수 있다.

Tokenizer ?

  • 요약하자면 Tokenization를 해주는 도구를 말한다. Tokenization이란 Text를 의미있는 요소들인 토큰으로 쪼개는 것을 말한다.

다양한 방법이 있으며 그에 따라 다양한 Tokenizer가 존재한다. 따라서 어떤 데이터를 다루느냐에 따라 다른 Tokenizer를 이용하는 것이 좋다.

예를 들어, "You know what? This is my code."라는 문장을
어떤 두 가지 Tokenizer(문장을 잘게 쪼개는, 소문자+구두점 제외)로는
['You','know','what','?','This','is','my','code']
['you','know','what?','this','is','my','code']로 다른 결과를 출력할 수 있다.

lexer ?

  • lexical analysis의 약자로, 어휘 분석 도구이다. 토큰의 의미를 분석하는 역할을 한다.

가래떡으로 예를 들었을 때, 기계에서 가래떡을 뽑아내다가(한글자씩 탐색하다가) 적당한 길이가 될 때(단어가 될 때) 잘라내는 것으로 생각해볼 수 있다.

Parser ?

  • 입력 데이터를 가지고 그것을 구조적으로 나타낼 수 있게 도와주는 도구. 또한 그러한 입력 데이터가 올바른지 검증도 한다.

결국 parser는 토큰화된 소스코드를 가지고 AST를 만드는 일을 한다. 그리고 이렇게 AST를 만들게 되면 이제 컴퓨터가 이해할 수 있는 언어로 바꿀(컴파일) 준비가 끝나게 된다.

내 코드와 비교해보기

Tokenizer

<를 기준으로 나눠서 각 요소를 토큰으로 지정

lexer

  • 각 토큰마다 >까지를 태그, 그 이후 부분을 text로 지정
  • 태그 안의 띄어쓰기를 기준으로 attributes를 나눔
  • attributes는 =을 기준으로 name과 value로 나눔

Parser

  • 태그를 검증하는 함수
    스택을 사용하여 구현 + br, hr, li는 예외로 둠.
  • 트리를 형성하는 함수
    재귀를 통해 구현.

웹브라우저의 DOM 파서

웹 브라우저의 DOM 파서는 HTML 문서를 어떻게 분석할까?

HTML은 암묵적으로 태그에 대한 생략이 가능하는 등 문법이 너그럽다. 따라서 파싱하기 어렵다. HTML 파싱은 크게 토큰화트리 구축 두 단계로 이루어져 있다.

토큰화

 <html>
   <body>
      Hello world
   </body>
</html>  

토큰화의 경우 어휘 분석으로서 연속된 문자를 입력받아 < 를 만나면 태그 열림 상태 가 되고, a-z까지의 문자를 입력받아 시작 태그를 만들고 > 를 만날 때까지 태그 이름상태가 된다. 이후 다시 < 만날 때까지 자료 상태가 되어 토큰을 발행 각각에 맞는 토큰을 발행한다.

트리 구축 알고리즘

 <html>
   <body>
      Hello world
   </body>
</html>  

토큰화에 의해 발행된 각 노드는 생성자에 의해 처리되는데, 위의 예로 설명하면 html 토큰을 받아 html 이전모드에서 HTMLHtmlElement 요소를 생성하고 객체 최상단에 추가된다. 이후 head 이전가 되는데 위의 예에서는 묵시적으로 생성되어 트리에 추가된다. 이어 head 다음모드로 body 안쪽로 문자열 토큰을 받았으면 본문 노드가 추가되고 이어 작업이 계속된다. </body>를 만나면 body 다음모드가 되어 마지막 파일 토큰을 받으면 파싱을 종료한다. 이렇게 되면 문서 객체가 생성된다.

DOM 트리에 요소를 추가하는 것이 아니라면 열린 요소는 스택(임시 버퍼 저장소)에 추가된다. 이 스택은 부정확한 중첩과 종료되지 않은 태그를 교정한다.

브라우저의 오류 처리

파서는 적어도 다음과 같은 오류를 처리해야 한다.

  • 어떤 태그의 안쪽에 추가하려는 태그가 금지된 것일 때 일단 허용된 태그를 먼저 닫고 금지된 태그는 외부에 추가한다.
  • 파서가 직접 요소를 추가해서는 안된다. 문서 제작자에 의해 뒤늦게 요소가 추가될 수 있고 생략 가능한 경우도 있다. HTML, HEAD, BODY, TBODY, TR, TD, LI 태그가 이런 경우에 해당한다.
  • 인라인 요소 안쪽에 블록 요소가 있는 경우 부모 블록 요소를 만날 때까지 모든 인라인 태그를 닫는다.
  • 이런 방법이 도움이 되지 않으면 태그를 추가하거나 무시할 수 있는 상태가 될 때까지 요소를 닫는다.

아래 예를 보자.

  • <br> 대신 </br>
    어떤 사이트는 <br> 대신 </br>을 사용한다. 인터넷 익스플로러, 파이어폭스와 호환성을 갖기 위해 웹킷은 이것을 <br> 으로 간주한다.
  • 어긋난 표
    어긋난 표는 표 안에 또 다른 표가 th 또는 td 셀 내부에 있지 않은 것을 의미한다. 아래 예제와 같은 경우를 말한다.
  • <table> <table> <tr><td>inner table</td></tr> </table> <tr><td>outer table</td></tr>

```

이런 경우 웹킷은 표의 중첩을 분해하여 형제 요소가 되도록 처리한다.

<table>

    <tr><td>outer table</td></tr>

</table>

<table>

    <tr><td>inner table</td></tr>

</table>
  • 중첩된 폼 요소
    폼 안에 또 다른 폼을 넣은 경우 안쪽의 폼은 무시된다.
  • 태그 중첩이 너무 깊을 때
    최대 20개의 중첩만 허용하고 나머지는 무시한다.
  • 잘못 닫힌 html 또는 body 태그
    일부 바보 같은 페이지는 문서가 끝나기 전에 body를 닫아버리기 때문에 브라우저는 body 태그를 닫지 않는다. 대신 종료를 위해 end()를 호출한다.

XPath

xpath ?

  • XPath(XML Path Language)는 W3C의 표준으로 확장 생성 언어 문서의 구조를 통해 경로 위에 지정한 구문을 사용하여 항목을 배치하고 처리하는 방법을 기술하는 언어이다. XML 표현보다 더 쉽고 약어로 되어 있으며, XSL 변환(XSLT)과 XML 지시자 언어(XPointer)에 쓰이는 언어이다. XPath는 XML 문서의 노드를 정의하기 위하여 경로식을 사용하며, 수학 함수와 기타 확장 가능한 표현들이 있다.

[출처] : 위키백과

개발자 도구를 통해 XPath 값 가져오기

[출처] 크롬 개발자 도구를 활용하여 xpath 값 가져오기|작성자 David

XPath에서 요소 이름을 명시하지 않는 경우

  • 요소는 /
  • 속성은 @
  • 중간 생략은 // <-
  • 위치지정 [position()=3] or [3]

/html/body/div/span
XPath를 "//"를 이용해 생략하면, 아래와 같이 쓸 수 있다.

//span
//body/div[2]/span
이런 식으로 요소 이름을 명시하지 않더라도 사용이 가능하다.

well-formed XML

문법에 맞는(well-formed) XML 문서란 XML 문서로서 가져야 하는 최소한의 필수 요건을 충족한 XML 문서를 의미한다.

문법에 맞는(well-formed) XML 문서가 되기 위한 필수 요건은 다음과 같다.

  1. 루트(root) 요소를 하나만 가져야 함.
  2. 모든 XML 요소는 종료 태그를 가져야 함.
  3. 시작 태그와 종료 태그에 사용된 태그 이름이 대소문자까지 완벽하게 일치해야 함.
  4. 모든 XML 요소의 여닫는 순서가 반드시 정확하게 지켜져야 함.
  5. 모든 속성의 속성값이 따옴표로 둘러싸여 있어야 함.

위에서 언급한 필수 요건을 만족하지 못하는 XML 문서는 오류를 발생시키고 HTML 문서와 달리 해당 응용 프로그램의 모든 동작을 중지시킨다.

XML과 JSON

JSON의 장단점

장점

  • 서버와 클라이언트 모두에서 자바스크립트를 쓸 수 있는 자바스크립트!!
  • JSON은 유연하고 신속하므로 자바스크립트의 빠른 개발 속도로 인해 애자일 개발 방법을 수용할 기회를 제공한다.
  • JSON은 송수신단에서 데이터 요소를 패키지화하고 해제하는 추가 작업이 적고 매핑이 더 쉽다.
  • 자바스크립트에서 객체를 정의하고 실행 중 어떤 속성이든 추가할 수 있다.

단점

  • 실행 중 예상하지 못했던 데이터를 얻게 될 수 있다.

XML의 장단점

장점

  • 실행 중 예상치 못했던 데이터를 얻게 될 가능성을 아예 허용하지 않는다
  • 쿼리(Query)가 적용된 XML 기반 데이터베이스와 모두 XML로 작성한 앱 로직(Logic) 등
  • XML은 메타데이터를 지원한다.
  • JSON에서는 명칭 공간을 지원하지 않고, 그래픽 파일이나 문서 등의 바이너리(Binary) 코딩된 파일은 XML이 더 적합합니다.

단점

  • 데이터를 구조화하고 XML화 방식에 따라 문서와 코드 작성법을 고려해야 한다.
  • 초기 작업이 너무 많다.
  • 실행 중 속성을 추가하는 작업을 하는 것이 불가능하다.

출처: https://12bme.tistory.com/202 [길은 가면, 뒤에 있다.]

throw / try~catch

Throw 및 Catch

예외가 발생하면 예외가 throw되었다고 표현한다. Throw된 예외를 처리하려면 예외를 catch해야 한다. 예외가 throw되고 어떻게든 catch되지 않으면 스크립트 실행이 중지되게 된다.

Try/Catch

PowerShell로 (그리고 다른 많은 언어로) 오류 처리 수행할 때 사용자는 먼저 코드 일부를 try한 다음 오류가 throw되면 catch합니다. catch 스크립트는 종료 오류가 있을 때만 실행된다. try가 올바르게 실행된다면 catch는 건너뛴다

🎃 느낀점

기존의 XML을 파싱하면서 여러 에러처리를 깔끔하게 해야겠다는 생각을 했다. 예상치 못한 케이스에 의해 내 코드가 파괴당할 때의 기분이란..ㅎㅎ

출처

'[개발 공부]' 카테고리의 다른 글

TIL - Functional Programming  (0) 2021.09.21
TIL - Class  (0) 2021.09.21
TIL - Process Management  (0) 2021.09.21
TIL - Cache & Crawling  (0) 2021.09.21
TIL - Linux  (0) 2021.09.21