Python Element Tree 모듈 을 이용 하여 XML 을 처리 하 는 방법 에 대한 상세 한 설명

머리말
최근 작업 의 필요 로 인해 웹 서비스의 성능 을 테스트 하기 위해 Python 을 사용 하여 SOAP 요청 을 보 내 고 있 습 니 다.SOAP 는 XML 기반 이기 때문에 python 을 사용 하여 XML 데 이 터 를 처리 해 야 합 니 다.몇 가지 방안 을 비교 한 후에 마지막 으로 사용xml.etree.ElementTree 모듈 을 선정 하여 실현 한다.
이 글 은 사용xml.etree.ElementTree 모듈 에서 자주 사용 하 는 몇 가지 조작 을 기록 하 였 으 며,나중에 잊 어 버 리 지 않도록 정리 한 셈 이다.나 눠 도 방법 이 필요 한 분 들 은 학습 을 참고 하 세 요.다음은 더 이상 말씀 드 리 지 않 겠 습 니 다.상세 한 소 개 를 해 보 겠 습 니 다.
개술
다른 Python 이 XML 을 처리 하 는 방안 에 비해xml.etree.ElementTree 모듈(다음은 ET 로 표시)은 상대 적 으로 간단 하고 인터페이스 도 우호 적 입 니 다.
공식 문서에서 ET 모듈 에 대해 비교적 상세 하 게 설명 했다.전체적으로 보면 ET 모듈 은 세 가지 부분 으로 요약 할 수 있다.Element Tree 류,Element 류 와 XML 을 조작 하 는 함수 이다.
XML 은 트 리 구조 로 볼 수 있 으 며,ET 는 Element Tree 류 를 사용 하여 전체 XML 문 서 를 표시 하고,Element 류 를 사용 하여 XML 의 결점 을 표시 합 니 다.전체 XML 문서 에 대한 작업 은 일반적으로 Element Tree 대상 을 대상 으로 하고 XML 노드 에 대한 작업 은 일반적으로 Element 대상 을 대상 으로 합 니 다.
XML 파일 분석
ET 모듈 은 XML 파일 구조 Element Tree 대상 을 지원 합 니 다.예 를 들 어 XML 파일 example.xml 내용 은 다음 과 같 습 니 다.

<?xml version="1.0" encoding="utf-8"?>
<data>
 <country name="Liechtenstein">
  <rank>1</rank>
  <year>2008</year>
  <gdppc>141100</gdppc>
  <neighbor name="Austria" direction="E"/>
  <neighbor name="Switzerland" direction="W"/>
 </country>
 <country name="Singapore">
  <rank>4</rank>
  <year>2011</year>
  <gdppc>59900</gdppc>
  <neighbor name="Malaysia" direction="N"/>
 </country>
</data>
ET 모듈 의parse()함 수 를 사용 하여 지정 한 XML 파일 에서 Element Tree 대상 을 구성 할 수 있 습 니 다.

import xml.etree.ElementTree as ET

#    XML      ElementTree
tree = ET.parse('example.xml')
#    XML          Element
root = tree.getroot()
#         
print root.tag
XML 파일 에서 Element Tree 대상 을 구성 한 후 결점 을 가 져 오 거나 결점 을 계속 조작 할 수 있 습 니 다.
XML 문자열 분석
ET 모듈 의 from string()함 수 는 XML 문자열 에서 Element 대상 을 구성 하 는 기능 을 제공 합 니 다.

xml_str = ET.tostring(root)
print xml_str
root = ET.fromstring(xml_str)
print root.tag
이 어 위의 코드 는 ET 모듈 의tostring()함 수 를 사용 하여 위 에 있 는 우리 구조의 루트 대상 을 문자열 로 바 꾼 다음fromstring()함 수 를 사용 하여 Element 대상 을 다시 만 들 고 루트 변 수 를 부여 합 니 다.이때 루트 는 전체 XML 문서 의 근 결 점 을 대표 합 니 다.
구조 XML
XML 문 서 를 구성 해 야 한다 면 ET 모듈 의 Element 류 와SubElement()함 수 를 사용 할 수 있 습 니 다.
Element 클래스 를 사용 하여 Element 대상 을 루트 노드 로 만 든 다음ET.SubElement()함수 로 서브 노드 를 생 성 할 수 있 습 니 다.

a = ET.Element('a')
b = ET.SubElement(a, 'b')
b.text = 'leehao.me'
c = ET.SubElement(a, 'c')
c.attrib['greeting'] = 'hello'
d = ET.SubElement(a, 'd')
d.text = 'www.leehao.me'
xml_str = ET.tostring(a, encoding='UTF-8')
print xml_str
출력:

<?xml version='1.0' encoding='UTF-8'?>
<a><b>leehao.me</b><c greeting="hello" /><d>www.leehao.me</d></a>
파일 에 출력 할 필요 가 있 으 면 계속ElementTree.write()방법 으로 처리 할 수 있 습 니 다.

#       ElementTree       write   
tree = ET.ElementTree(a)
tree.write('a.xml', encoding='UTF-8')
실행 하면 XML 파일 a.xml 을 생 성 합 니 다.

<?xml version='1.0' encoding='UTF-8'?>
<a><b>leehao.me</b><c greeting="hello" /><d>www.leehao.me</d></a>
XML 노드 찾기 및 업데이트
1.XML 노드 찾기
Element 류 는Element.iter()방법 을 제공 하여 지정 한 결점 을 찾 습 니 다.Element.iter()조건 에 맞 는 모든 결산 점 을 찾 을 수 있 도록 모든 하위 결산 점 을 재 귀적 으로 찾 습 니 다.

#    XML      ElementTree
tree = ET.parse('example.xml')
#    XML          Element
root = tree.getroot()
#         neighbor    
for neighbor in root.iter('neighbor'):
 print neighbor.attrib
출력:

{'direction': 'E', 'name': 'Austria'}
{'direction': 'W', 'name': 'Switzerland'}
{'direction': 'N', 'name': 'Malaysia'}
Element.findall()또는Element.find()방법 을 사용 하면 결점 의 직접 자 결점 에서 만 찾 을 수 있 고 재 귀적 으로 찾 지 않 습 니 다.

for country in root.findall('country'):
 rank = country.find('rank').text
 name = country.get('name')
 print name, rank
출력:

Liechtenstein 1
Singapore 4
2.결산 점 업데이트
결점 의 텍스트 를 업데이트 해 야 한다 면 직접 수정Element.text을 통 해 이 루어 질 수 있다.결점 의 속성 을 업데이트 해 야 한다 면 직접 수정Element.attrib을 통 해 이 루어 질 수 있다.
노드 를 업데이트 한 후ElementTree.write()방법 으로 업 데 이 트 된 XML 문 서 를 파일 에 기록 할 수 있 습 니 다.

#    XML      ElementTree
tree = ET.parse('example.xml')
#    XML          Element
root = tree.getroot()
for rank in root.iter('rank'):
 new_rank = int(rank.text) + 1
 rank.text = str(new_rank)
 rank.attrib['updated'] = 'yes'
tree.write('output.xml', encoding='UTF-8')
새로 생 성 된 output.xml 파일 아래:

<?xml version='1.0' encoding='UTF-8'?>
<data>
 <country name="Liechtenstein">
  <rank updated="yes">2</rank>
  <year>2008</year>
  <gdppc>141100</gdppc>
  <neighbor direction="E" name="Austria" />
  <neighbor direction="W" name="Switzerland" />
 </country>
 <country name="Singapore">
  <rank updated="yes">5</rank>
  <year>2011</year>
  <gdppc>59900</gdppc>
  <neighbor direction="N" name="Malaysia" />
 </country>
</data>
example.xml 파일 을 비교 하면 output.xml 파일 이 업데이트 되 었 음 을 볼 수 있 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
참고 자료
  • https://docs.python.org/2/library/xml.html#xml-vulnerabilities
  • https://stackoverflow.com/questions/1912434/how-do-i-parse-xml-in-python
  • 좋은 웹페이지 즐겨찾기