본문 바로가기
SW 개발/Python

[Tips] Python 에서 XML comment 처리 - Sample code 제공

by Kibua20 2020. 6. 2.

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 기준)

Commented Parser 실행 결과

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)

ElementTree를 XML로 저장 시 한글 깨짐 현상 수정

 

ElementTree.write() 함수 인자 설명

 

<관련 글>

모바일/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'에러 수정




댓글