Python에서 XML 파서 만들기

Vaibhhav Khetarpal 2023년10월10일
  1. ElementTree API를 사용하여 Python에서 XML 문서 구문 분석
  2. minidom 모듈을 사용하여 Python에서 XML 문서 구문 분석
  3. Beautiful Soup 라이브러리를 사용하여 Python에서 XML 문서 구문 분석
  4. xmltodict 라이브러리를 사용하여 Python에서 XML 문서 구문 분석
  5. lxml 라이브러리를 사용하여 Python에서 XML 문서 구문 분석
  6. untangle 모듈을 사용하여 Python에서 XML 문서 구문 분석
  7. declxml 라이브러리를 사용하여 Python에서 XML 문서 구문 분석
Python에서 XML 파서 만들기

XML은 eXtensible Markup Language의 약자로 데이터를 저장하고 전송하는 데 사용되는 자체 설명 언어입니다. Python은 XML 문서의 구문 분석 및 수정을 위한 매체를 제공합니다.

이 자습서는 Python에서 XML 문서를 구문 분석하는 다양한 방법에 중점을 두고 설명합니다.

ElementTree API를 사용하여 Python에서 XML 문서 구문 분석

xml.etree.ElementTree 모듈은 XML 문서를 구문 분석하고 XML 데이터를 생성하는 효율적이면서도 간단한 API를 생성하는 데 활용됩니다.

다음 코드는 xml.etree.ElementTree 모듈을 사용하여 Python에서 XML 문서를 구문 분석합니다.

# >= Python 3.3 code
import xml.etree.ElementTree as ET

file1 = """<foo>
           <bar>
               <type foobar="Hello"/>
               <type foobar="God"/>
          </bar>
       </foo>"""
tree = ET.fromstring(file1)
x = tree.findall("bar/type")
for item in x:
    print(item.get("foobar"))

출력:

Hello
God

여기에서 XML 데이터를 삼중 따옴표 안에 문자열로 전달합니다. ElementTree 모듈의 parse() 함수를 사용하여 실제 XML 문서를 가져올 수도 있습니다.

cElementTree 모듈은 ElementTree API의 C 구현이며 cElementTree가 최적화되었다는 유일한 차이점이 있습니다. 즉, ElementTree 모듈보다 약 15-20배 더 빠르게 구문 분석할 수 있으며 매우 적은 양의 메모리를 사용합니다.

그러나 Python 3.3 이상에서는 cElementTree 모듈이 더 이상 사용되지 않으며 ElementTree 모듈은 더 빠른 구현을 사용합니다.

minidom 모듈을 사용하여 Python에서 XML 문서 구문 분석

xml.dom.minidom은 DOM(Document Object Model) 인터페이스의 기본 구현으로 정의할 수 있습니다. 모든 DOM 응용 프로그램은 일반적으로 XML 개체의 구문 분석으로 시작합니다. 따라서 이 방법은 Python에서 XML 문서를 구문 분석하는 가장 빠른 방법입니다.

다음 코드는 minidom 모듈의 parse() 함수를 사용하여 Python에서 XML 문서를 구문 분석합니다.

XML 파일(sample1.xml):

<data>
    <strings>
        <string name="Hello"></string>
        <string name="God"></string>
    </strings>
</data>

파이썬 코드:

from xml.dom import minidom

xmldoc = minidom.parse("sample1.xml")
stringlist = xmldoc.getElementsByTagName("string")
print(len(stringlist))
print(stringlist[0].attributes["name"].value)
for x in stringlist:
    print(x.attributes["name"].value)

출력:

2
Hello
God

이 모듈을 사용하면 ElementTree API와 유사한 XML을 문자열로 전달할 수도 있습니다. 그러나 이를 달성하기 위해 parseString() 함수를 사용합니다.

xml.etree.ElementTreexml.dom.minidom 모듈은 모두 악의적으로 구성된 데이터에 대해 안전하지 않다고 합니다.

Beautiful Soup 라이브러리를 사용하여 Python에서 XML 문서 구문 분석

Beautiful Soup 라이브러리는 웹 스크래핑 프로젝트를 위해 설계되었으며 XMLHTML 파일에서 데이터를 가져옵니다. Beautiful Soup은 정말 빠르며 만나는 모든 것을 구문 분석할 수 있습니다.

이 라이브러리는 프로그램에 대한 트리 탐색 프로세스도 수행하고 XML 문서를 구문 분석합니다. 또한 Beautiful Soup은 주어진 소스 코드를 꾸미는 데에도 사용됩니다.

Beautiful Soup 라이브러리를 수동으로 설치한 다음 이 방법에 대한 Python 코드로 가져와야 합니다. 이 라이브러리는 pip 명령을 사용하여 설치할 수 있습니다. 최신 버전인 Beautiful Soup 4 라이브러리는 Python 2.7 이상에서 작동합니다.

다음 코드는 Beautiful Soup 라이브러리를 사용하여 Python에서 XML 문서를 구문 분석합니다.

from bs4 import BeautifulSoup

file1 = """<foo>
   <bar>
      <type foobar="Hello"/>
      <type foobar="God"/>
   </bar>
</foo>"""

a = BeautifulSoup(file1)
print(a.foo.bar.type["foobar"])
print(a.foo.bar.findAll("type"))

출력:

u'Hello'
[<type foobar="Hello"></type>, <type foobar="God"></type>]

Beautiful Soup는 파싱에 사용되는 다른 어떤 도구보다 빠르지만 이 방법을 이해하고 구현하는 것이 때때로 어려울 수 있습니다.

xmltodict 라이브러리를 사용하여 Python에서 XML 문서 구문 분석

xmltodict 라이브러리는 XML 파일의 프로세스를 JSON과 유사하게 만드는 데 도움이 됩니다. XML 파일을 구문 분석하려는 경우에도 사용할 수 있습니다. 이 경우 xmltodict 모듈은 XML 파일을 Ordered Dictionary로 구문 분석하여 사용할 수 있습니다.

xmltodict 라이브러리를 수동으로 설치한 다음 XML 파일이 포함된 Python 코드로 가져와야 합니다. xmltodict 설치는 매우 기본적이며 표준 pip 명령을 사용하여 수행할 수 있습니다.

다음 코드는 xmltodict 라이브러리를 사용하여 Python에서 XML 문서를 구문 분석합니다.

import xmltodict

file1 = """<foo>
             <bar>
                 <type foobar="Hello"/>
                 <type foobar="God"/>
             </bar>
        </foo> """
result = xmltodict.parse(file1)
print(result)

출력:

OrderedDict([(u'foo', OrderedDict([(u'bar', OrderedDict([(u'type', [OrderedDict([(u'@foobar', u'Hello')]), OrderedDict([(u'@foobar', u'God')])])]))]))])

lxml 라이브러리를 사용하여 Python에서 XML 문서 구문 분석

lxml 라이브러리는 XML 및 HTML 파일을 구문 분석하는 데 사용되는 Python에서 간단하지만 매우 강력한 API를 제공할 수 있습니다. ElementTree API를 libxml2/libxslt와 결합합니다.

간단히 말해서 lxml 라이브러리는 이전 ElementTree 라이브러리를 확장하여 XML 스키마, XPath 및 XSLT와 같은 훨씬 더 새로운 기능을 지원합니다.

여기서는 lxml.objectify 라이브러리를 사용합니다. 다음 코드는 lxml 라이브러리를 사용하여 Python에서 XML 문서를 구문 분석합니다.

from collections import defaultdict
from lxml import objectify

file1 = """<foo>
                <bar>
                    <type foobar="1"/>
                    <type foobar="2"/>
                </bar>
            </foo>"""

c = defaultdict(int)

root = objectify.fromstring(file1)

for item in root.bar.type:
    c[item.attrib.get("foobar")] += 1

print(dict(c))

출력:

{'1': 1, '2': 1}

여기 이 프로그램에서 c 변수는 사전에서 사용 가능한 각 항목의 개수를 저장하는 데 사용됩니다.

untangle 모듈을 사용하여 Python에서 XML 문서 구문 분석

untangle 모듈은 XML을 Python 개체로 변환하는 데 중점을 둔 구현하기 쉬운 모듈입니다. pip 명령을 사용하여 쉽게 설치할 수도 있습니다. 이 모듈은 Python 2.7 이상에서 작동합니다.

다음 코드는 untangle 모듈을 사용하여 Python에서 XML 문서를 구문 분석합니다.

XML 파일(sample1.xml):

<foo>
   <bar>
      <type foobar="Hello"/>
   </bar>
</foo>

파이썬 코드:

import untangle

x = untangle.parse("/path_to_xml_file/sample1.xml")
print(x.foo.bar.type["foobar"])

출력:

Hello

declxml 라이브러리를 사용하여 Python에서 XML 문서 구문 분석

Declarative XML Processing의 약자인 declxml 라이브러리는 XML 문서를 직렬화하고 구문 분석하는 간단한 API를 제공하는 데 사용됩니다. 이 라이브러리는 minidom 또는 ElementTree와 같은 다른 인기 있는 API를 사용할 때 필요한 구문 분석 논리의 크고 긴 코드 덩어리를 통과해야 하는 필요성을 대체하고 프로그래머의 작업량을 줄이는 것을 목표로 합니다.

declxml 모듈은 pip 또는 pipenv 명령을 사용하여 시스템에 쉽게 설치할 수 있습니다. 다음 코드는 declxml 라이브러리를 사용하여 Python에서 XML 문서를 구문 분석합니다.

import declxml as xml

xml_string = """
<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="3"/>
      <type foobar="5"/>
   </bar>
</foo>
"""

processor = xml.dictionary(
    "foo", [xml.dictionary("bar", [xml.array(xml.integer("type", attribute="foobar"))])]
)

xml.parse_from_string(processor, xml_string)

출력:

{'bar': {'foobar': [1, 3, 5]}}

이 방법에서는 주어진 XML 문서의 구조를 선언적으로 특성화하고 XML과 Python 데이터 구조 간의 매핑을 위해 프로세서를 사용합니다.

Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.

LinkedIn

관련 문장 - Python XML