Today
-
Total
-
  • [Python] XML문서 생성하기
    Coding/Python 2019. 9. 10. 11:55

    파이썬에서 XML문서를 다루는 라이브러리는 아주 많지만 그중 가장 많이 사용되는 ElementTree를 사용해보려 합니다.

    이번 포스팅에서는 ElementTree를 이용하여 XML문서를 생성해보는 것을 해보도록 하겠습니다.

    태그 만들기

    Element를 이용하여 태그를 만들 수 있으며(Element 클래스 값으로 저장됩니다)

    만들어진 태그에 텍스트 값을 추가할 수 있습니다.

    append를 이용하여 하위 태그에 추가할 수 있습니다. dump는 매개변수로 들어온 태그 이하를 모두 print 해줍니다.

    import xml.etree.ElementTree as ET
    
    # Element를 이용하여 태그를 만들 수 있다
    korea = ET.Element("korea")
    seoul = ET.Element("seoul")
    # 만들어진 태그에 Text값을 추가할 수 있다
    seoul.text="city"
    # append를 이용하여 하위 태그에 추가할 수 있다.
    korea.append(seoul)
    ET.dump(korea)

    다음 코드는 Korea와 Seoul 태그를 만들고, korea의 하위 태그로 seoul 태그를 추가하는 코드입니다.

    seoul 태그의 text값은 지정한대로 'city'가 될 것입니다.

    실행 결과는 다음과 같습니다.

    <korea><seoul>city</seoul></korea>

    피곤하게 append로 하위 태그를 추가해 줄 필요 없이, 상/하위 관계가 확실하다면

    SubElement를 이용하여 조금 더 편리하게 태그를 추가할 수 있습니다.

    import xml.etree.ElementTree as ET
    
    korea = ET.Element("korea")
    # SubElement는 부모 태그를 지정하여 바로 하위 태그를 만들 수 있다.
    ET.SubElement(korea, "busan")
    # 하위 태그를 만들면서 바로 text를 지정할 수도 있다.
    ET.SubElement(korea, "seoul").text = "city"
    ET.dump(korea)

    SubElement(부모태그명, 만들태그명)

    을 이용하면 쉽게 하위 태그를 만들 수 있습니다. 또한 태그를 만들면서 동시에 text를 지정할 수도 있습니다.

    다음 코드의 실행 결과는 다음과 같습니다.

    <korea><busan /><seoul>city</seoul></korea>

    애트리뷰트 추가하기

    이번에는 애트리뷰트를 추가해 보겠습니다.

    attrib을 이용하여 애트리뷰트와 애트리뷰트 값을 추가할 수 있습니다.

    import xml.etree.ElementTree as ET
    
    korea = ET.Element("korea")
    seoul = ET.Element("seoul")
    
    korea.append(seoul)
    # attrib을 통해 애트리뷰트 값을 추가한다
    korea.attrib["where"] = 'Asia'
    
    # Element 생성 시 직접 애트리뷰트 값을 추가할 수도 있다.
    italy = ET.Element("italy", where='Europe')
    
    ET.dump(korea)
    ET.dump(italy)

    korea 태그의 attribute 'where'에 Asia를,

    italy 태그의 attribute 'where'에 Europe를 추가하는 각각 다른 방법입니다.

    다음 코드의 실행 결과는 다음과 같을 것입니다.

    <korea where="Asia"><seoul /></korea>
    <italy where="Europe" />

    indent 함수를 이용하여 정렬하기

    위의 결과값에서 느끼셨겠지만, 우리가 기존에 보던 xml파일 코드와는 다르게 보기가 힘듭니다.

    indent 함수를 통해 정렬된 형태의 xml값을 볼 수 있습니다.


    indent 함수 출처

    import xml.etree.ElementTree as ET
    
    korea = ET.Element("korea", where="asia")
    
    seoul = ET.Element("seoul")
    seoul.text = "서울"
    korea.append(seoul)
    
    busan = ET.Element("busan")
    busan.text = "부산"
    korea.append(busan)
    
    def indent(elem, level=0):
        i = "\n" + level*"  "
        if len(elem):
            if not elem.text or not elem.text.strip():
                elem.text = i + "  "
            if not elem.tail or not elem.tail.strip():
                elem.tail = i
            for elem in elem:
                indent(elem, level+1)
            if not elem.tail or not elem.tail.strip():
                elem.tail = i
        else:
            if level and (not elem.tail or not elem.tail.strip()):
                elem.tail = i
    indent(korea)
    ET.dump(korea)

    indent 함수는 xml형태로 정렬시켜주며, 출력 결과는 다음과 같습니다.

    <korea where="asia">
      <seoul>서울</seoul>
      <busan>부산</busan>
    </korea>

    우리가 자주 보던 문서처럼 출력되게 됩니다!

    xml 파일로 쓰기

    이제 xml 문서를 만들었으니 write 메소드를 이용하여 파일로 저장할 수 있습니다.

    방금 진행한 indent 코드의 마지막에

    ET.ElementTree(korea).write("korea.xml")

    를 추가해 줍시다.(import를 적게 사용하기 위해 as를 사용하다보니 비교적 깔끔하지 못한 코드가 나왔습니다.ㅠㅠ)

    그리고 실행시켜 보면 해당 .py 파일이 있는 장소에 korea.xml 파일이 추가되게 됩니다.

    !! 근데 xml파일을 살펴보면 한글 부분은 16진수로 깨져있는 것을 확인할 수 있으실 겁니다.

    이것은 인코딩 방식의 문제로 파이썬은 기본적으로 한글 문자열의 경우 cp949로 인코딩합니다.

    (실제로 깨진 파일의 xml문서를 편집기로 열어보면 인코딩 방식이 cp949로 되있는 것을 확인할 수 있습니다)

    한글이 깨지지 않게 하려면 write메소드에서 encoding 방식을 지정해 주면 됩니다.

    ET.ElementTree(korea).write("korea.xml", encoding="utf-8", xml_declaration=True)

    로 바꿔서 사용해주시면 xml문서에 정상적으로 표기가 되고, xml version 또한 같이 입력됩니다.



    본 문서는 markdown으로 작성되었습니다.

    댓글