본문 바로가기
SW 개발/Python

[Tips] XML 에서 예약/특수 문자 처리

by Kibua20 2020. 5. 31.

1. XLM 예약 문자 - "Parser Error : not well-formed"

요즘 Python 사용해서 XML 을  처리하다가 닭질(?) 내용을 정리합니다.  ElementTree 로 XML 파일을 문제 없이 잘 사용하고 있다가 파이썬 코드는 변경이 없음에도 불구하고 갑자기 XML Parser에서 "Parser Error : not well-formed"  이 발생하는 경우가 있다.   에러 발생 원인은 XML 파일에 예약 문제가 포함되어 있기 때문으로 아래와 같이 문자열 변환 과정을 거쳐야 한다. 

 

XML Parser error : not well-formed (invalided token)

#Xml 로딩하는 코드  

import xml.etree.ElementTree as ET
from xml.etree.ElementTree import ElementTree, Element, SubElement, dump

xmltree=ET.parse(xml_file_name)
xmlroot = xmltree.getroot()
    
#실행 결과
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 122, column 43

# xml file - (에러 발생)
<test xml_item="test&xyz" />

# xml file - (수정된 버전:& 대신 &amp; 로 치환)
<tes xml_item="test&amp;xyz" />

 

XML 에서 well-formed 텍스트 아래와 같이 정의할 수 있다. 아래 4) 번째 조건이 맞지 않아서 Parse Error가 발생한 것이다. 

 1) 문서는 적절히 인코딩된 올바른(legal) 유니코드 문자만을 포함한다.
 2) <나 & 같은 특수 문법 문자 중 어떤 것도, 원래의 마크업 경계 식별 목적 이외의 목적으로 나타나지 않는다.
 3)  엘리먼트의 한계를 정하는 시작 태그, 끝 태그, 빈 엘리먼트 태그들은 모두 올바르게, 빠지거나 중복됨이 없이, 겹쳐진다(nested).
 3) 엘리먼트의 태그는 대소문자를 구분한다; the beginning and end tags must match exactly.
 4) 태그 이름은 다음 문자를 포함할 수 없다 !"#$%&'()*+,/;<=>?@[\]^`{|}~. 또 공백 문자도 포함할 수 없으며, -, ., 또는 숫자로 시작할 수 없다.
 5) 하나의 "루트root" 엘리먼트가 다른 모든 엘리먼트를 포함한다.
※ 출처: https://ko.wikipedia.org/wiki/XML

예약 문자 리스트 (출처:https://ilovehsk.tistory.com/80)

예약/특수문자

문자열 치환

예약/특수 문자

문자열 치환

 &lt;

&lt; or =

>

 &gt;

&gt; or =

&

 &amp;

±

+/-

α

alpha

˚

degrees

β

beta

degrees C

γ

gamma

--&gt;

δ,Δ

delta

㎍, μG

microgram

ε

epsilon

㎕, μL

microliter

ζ

zeta

㎛, μM

micrometer

η

eta

®

(R)

θ

theta

(TM)

ι

iota

χ2

chi─square

κ

kappa

K+

K+

λ

lambda

Cl-

Cl-

μ

micron

Mg2+

Mg2+

ν

nu

CO2

CO2

ξ

xi

H2O

H2O

ο

omicron

102

10(2)

π

pi

10 02

10(-2)

ρ

rho

height2.239

height(2.239)

σ, Σ

sigma

τ

tau

υ

upsilon

φ

phi

χ

chi

ψ

psi

ω, Ω

omega

 

<관련글>

모바일/Python] - [Tips] Python: XML Parsing 시 multiple elements on top level

[모바일/Python] - [Tips] XML 에서 예약/특수 문자 처리

[모바일/Python] - [Tips] Python 에서 XML comment 처리 - Sample code 제공

[모바일/Android] - Android Studio 4.0 사용하기

[개발환경] - 13. 광고 없이 Youtube 동영상 다운로드 방법

[개발환경] - 12. 우분투에서 NTFS 를 rw 마운트

[개발환경] - 10. Ubuntu에서 Microsoft 365 '무료'로 사용하기

[모바일/Python] - SyntaxError: Non-ASCII character in file on, but no encoding declared

[모바일/Python] - Python 2.7과 3.8호환성: a bytes-like object is required, not 'str'에러 수정




댓글