본문 바로가기
기본적인프로그래밍/python

[xml,lxml, python] xml, lxml 정리 및 python으로 다뤄보기

by 인포메틱스 2022. 9. 14.
반응형

 이미지 분석 중에 segmentation 분석을 하기 위해서는 annotation 파일을 다룰 줄 알아야 합니다. annotation 데이터 중에는 xml 포멧이 있는데 보기만 해도 어렵습니다.

 

<ASAP_Annotations>
	<Annotations>
		<Annotation Name="Annotation 0" Type="Rectangle" PartOfGroup="Test Group" Color="#F4FA58">
			<Coordinates>
				<Coordinate Order="0" X="9844" Y="79825"/>
				<Coordinate Order="1" X="94204" Y="79825"/>
				<Coordinate Order="2" X="94204" Y="6406"/>
				<Coordinate Order="3" X="9844" Y="6406"/>
			</Coordinates>
		</Annotation>
		<Annotation Name="Annotation 1" Type="Rectangle" PartOfGroup="Test Group" Color="#F4FA58">
			<Coordinates>
				<Coordinate Order="0" X="1523" Y="9144"/>
				<Coordinate Order="1" X="3516" Y="9144"/>
				<Coordinate Order="2" X="3516" Y="82"/>
				<Coordinate Order="3" X="1523" Y="82"/>
			</Coordinates>
		</Annotation>
		<Annotation Name="Annotation 2" Type="Rectangle" PartOfGroup="Test Group" Color="#F4FA58">
			<Coordinates>
				<Coordinate Order="0" X="210" Y="797"/>
				<Coordinate Order="1" X="766" Y="797"/>
				<Coordinate Order="2" X="766" Y="74"/>
				<Coordinate Order="3" X="210" Y="74"/>
			</Coordinates>
		</Annotation>
	</Annotations>
	<AnnotationGroups>
		<Group Name="Test Group" PartOfGroup="None" Color="#64FE2E">
			<Attributes/>
		</Group>
	</AnnotationGroups>
</ASAP_Annotations>

 

 xml의 경우 annotation 데이터이외에도 다양한 자료를 정리할때 사용이 됩니다. 또한 보면 html, lxml과도 정말 비슷한 구조를 하고 있고, 분석을 할때도 유사한 패턴으로 분석이 가능합니다.

 

1. xml 구조 정리

 xml분석에 앞서 필요한 것들만 간단하게 정리를 하자면, xml은 일반적으로 트리(tree)형태의 계층구조를 갖습니다.

 

 하나의 root에 아래 다양한 child요소가 차례로 연결되어 있으며, 역슬래시 / 로 끝을 구분(end-tag)합니다. xml 파일을 보면 알아서 정렬이 되어 있는 경우가 있습니다.

1-0. 선언

 선언의 경우 있는 경우도 있고 없는 경우도 있습니다. tool이나 공개한 데이터마다 다릅니다.

1-1. element (요소)

 element는 xml의 필수적인 부분입니다. 첫 element가 root라고해도 무방합니다. root밑에 subelement 또한 element요소를 갖습니다.

 

element는 시작(start-tag)과 끝(end-tag)로 구성되어 있습니다. 끝의 경우 아까 말씀드렸듯이 역슬래쉬로 표시가 됩니다.

# xml_start는 element이고 root이다.
<xml_start> # start-tag
	# xlm_info는 xml_start에 포함되어있는 subelement이다.
	<xml_info>Bioinformatics</xml_info> # 이처럼 start-tag, end-tag가 같이 있는 경우도 있다.
</xml_start> # end-tag

 

1-2. attribute (속성)

 element에다 내용들을 추가할 수가 있다. 어떤 element든 간에 다양한 정보들을 가지고 올 수가 있다. 중복된 element를 구별하는데도 사용이 가능합니다.

# xml_start는 element이고 root이다.
<xml_start> # start-tag
	# xlm_info는 xml_start에 포함되어있는 subelement이다.
        <xml_info Group = 'Group1'>Bioinformatics_stat</xml_info> # xml_info라도 Group을 통해 구별이 가능하다.
        <xml_info Group = 'Group2'>Bioinformatics_stat1</xml_info> 
</xml_start> # end-tag

 

2. xml 다루기!

 

 python에서 xml을 다루기 위해서는 xml (lxml) module을 이용합니다. xml과 lxml용법도 같이 쓰도록 하겠습니다.

# xml 파일 읽어오기
import xml.etree.ElementTree as ET
xml_file = ET.parse(xml file path)
# root element가져오기
root = xml_file.getroot()
# xml파일 다 읽어오기 
# dump의 경우 파일 수정후 확인할때도 사용됩니다.
ET.dump(root)
# 속성을 보기
root.attrib # 속성이 없다면 {} 만 나옴.
# 속성을 넣기
root.attrib['root1']='authority1'
root.attrib['root2']='authority2'
root.attrib
# 결과가 {'root1': 'authority1', 'root2': 'authority2'} 로 나옵니다.
# root에서 attribute가 되는 만큼 subelement에서도 가능합니다.
# root.find를 통해서 바로 밑에 subelement를 가지고 올 수 있습니다.
root.find(element_name)
# iter를 사용하게 되면 root, subelement 모두를 확인할 수 있습니다.
for i in root.iter():
	print(i)
# iter에다가 name을 추가로 적어주게 되면 특정 element들만 가지고 올 수가 있습니다.
for i in root.iter(element_name)
	print(i)

# 추가로 iter를 이용해서 element의 속성도 확인할 수가 있습니다.
for i in root.iter('Coordinates'):
	for l in i.iter():
    	print(l.attrib)
        
########################################

# xml 제작하기
root = ET.Element(root_name)
# sub element 제작하기
subelement1=ET.SubElement(root,subelement_name)
# sub element에 속성도 추가가 가능함.
subelement1.attrib['subject']='medical_infomatics'
subelement1.attrib['subject1']='pathology_infomatics'
# 속성을 볼때 dictionary로 output이 나온다고 해서 attribute input을 dictionary로 넣으면 안됨.
subelement1.attrib ={'d': 'ddd','c':'ccc'} # 이렇게 안된다는 말씀.

# Subelement function의 경우 알아서 sub로 들어가게됨.
# Sub의 Sub를 제작할때도 마찬가지로 사용함.

 

 xml을 분석하다 보면 가끔 lxml이라는 에러가 뜰때가 있는데, 이때는 lxml 모듈을 사용하여 분석하면 된다.

 

import lxml.etree as etree
# etree안에 Element, subelement 기능들이 다있다. dump 또한 있음.

 

 

 

 

 

728x90
반응형

댓글