1. XLM 예약 문자 - "Parser Error : not well-formed"
요즘 Python 사용해서 XML 을 처리하다가 닭질(?) 내용을 정리합니다. ElementTree 로 XML 파일을 문제 없이 잘 사용하고 있다가 파이썬 코드는 변경이 없음에도 불구하고 갑자기 XML Parser에서 "Parser Error : not well-formed" 이 발생하는 경우가 있다. 에러 발생 원인은 XML 파일에 예약 문제가 포함되어 있기 때문으로 아래와 같이 문자열 변환 과정을 거쳐야 한다.
#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 - (수정된 버전:& 대신 & 로 치환)
<tes xml_item="test&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)
예약/특수문자 |
문자열 치환 |
예약/특수 문자 |
문자열 치환 |
< |
< |
≤ |
< or = |
> |
> |
≥ |
> or = |
& |
& |
± |
+/- |
α |
alpha |
˚ |
degrees |
β |
beta |
℃ |
degrees C |
γ |
gamma |
→ |
--> |
δ,Δ |
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'에러 수정
댓글