1. Python으로 XML 처리할 때 comment 남겨두기
Python 에서 XML 처리할 때 많이 사용하는 ElementTree 기준으로 설명한다. Comment가 포함된 XML 파일을 ElementTree.parser() 사용해서 읽어 보면 Tree element 에 comment 는 포함되지 않는다. 만일 XML File 의 Comment 를 유지해야 하는 경우 아래와 같이 CommentedTreeBuilder class를 만들고 comment() 함수를 추가해야 한다.
ElementTree 의 API 에 대한 설명은 https://docs.python.org/3.8/library/xml.etree.elementtree.html 에 자세하게 작성되어 있고, 내부 구현을 따라가보면 XML tree builder에서 Comment가 있으면 element 에 추가 없이 skip 하는데, comment() 를 오버라이딩해서 comment를 element에 추가하도록 구현되어 있다. 아래 sample code는 python 3.8 과 python 2.7 버전에서도 동작한다. 참고로 ElementTree는 Python 버전이 올라감에 따라서 API도 추가되고 있고, 결과도 차이가 난다. 가능하면 최신 Python 버전으로 테스트 하는 것을 추천한다.
아래 sample code는 GitHub에서도 확인할 수 있다.
https://github.com/kibua20/devDocs/blob/master/CommentedXml.py
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import ElementTree, Element, SubElement, dump
#-------------------------------------------------------------------------
class CommentedTreeBuilder(ET.TreeBuilder):
def __init__(self, *args, **kwargs):
super(CommentedTreeBuilder, self).__init__(*args, **kwargs)
def comment(self, data):
self.start(ET.Comment, {})
self.data(data)
self.end(ET.Comment)
if __name__ == "__main__":
print ('---------------------------------------------------------')
print ('Before: ElementTree ogirinal parser() dump()')
tree = ET.parse('sample.xml')
root = tree.getroot()
dump (root)
# xml tree 를 파일로 저장한다.
tree.write('original.xml', xml_declaration=True)
print ('---------------------------------------------------------')
print ('After:Commented parser dump')
tree = ET.parse('sample.xml',parser=ET.XMLParser(target = CommentedTreeBuilder()))
root = tree.getroot()
dump (root)
# xml tree 를 파일로 저장한다.
tree.write('commented_parser.xml')
# 한글커멘트가 깨지 않도록 utf8 로 저장
tree.write('commented_parser2.xml', encoding='utf8', xml_declaration=True)
실행 결과 (pthon3 기준)
2. ElementTree를 XML로 저장 시 한글 깨짐 현상 수정
ElementTree 를 파일로 저장하는 함수는 ElementTree.write()이다. ElementTree.write() 로 tree elment를 파일로 저장하면 한글이 깨져서 저장된다. ElementTree.write() 함수 설명을 보면 encoding default 값이 'us-ascii' 라 한글이 깨지는 것이고, 'utf8' 로 저장하면 한글이 깔끔하게 유지된다.
tree.write('commented_parser2.xml', encoding='utf8')
그리고, 'commented_parser.xml 을 상단에 XML 선언 내용이 저장되지 않았다. 이 부분은 write() 함수에서xml_declaration=True로 저장하면 xml 선언과 encoding 타입이 저장된다.
tree.write('commented_parser2.xml', encoding='utf8', xml_declaration=True)
<관련 글>
모바일/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'에러 수정
댓글