Python 액세스 XML 의 일반적인 방법 인 스 턴 스 분석
현재 Python 3.2 액세스 XML 은 다음 과 같은 네 가지 방법 이 있 습 니 다.
1.Expat
2.DOM
3.SAX
4.ElementTree
다음 xml 를 토론 근거 로 합 니 다.
<?xml version="1.0" encoding="utf-8"?>
<Schools>
<School Name="XiDian">
<Class Id="030612">
<Student Name="salomon">
<Scores>
<Math>98</Math>
<English>85</English>
<physics>89</physics>
</Scores>
</Student>
<Student Name="Jupiter">
<Scores>
<Math>74</Math>
<English>83</English>
<physics>69</physics>
</Scores>
</Student>
</Class>
<Class Id="030611">
<Student Name="Venus">
<Scores>
<Math>98</Math>
<English>85</English>
<physics>89</physics>
</Scores>
</Student>
<Student Name="Mars">
<Scores>
<Math>74</Math>
<English>83</English>
<physics>69</physics>
</Scores>
</Student>
</Class>
</School>
</Schools>
ExpatExpat 는 흐름 을 위 한 해상도 입 니 다.등 록 된 해상도 기 리 셋(또는 handler)기능 을 사용 한 다음 문 서 를 검색 하기 시작 합 니 다.해상도 기 가 이 파일 의 지정 한 위 치 를 인식 하면 해당 부분 에 해당 하 는 처리 프로그램 을 호출 합 니 다(등록 되 어 있 는 경우).이 파일 은 해상도 기 에 보 내 져 여러 개의 세 션 으로 나 뉘 어 메모리 에 세그먼트 로 장 착 됩 니 다.따라서 expat 는 그 거대 한 파일 들 을 해석 할 수 있다.
SAX
SAX 는 XML 을 순차 적 으로 액세스 하 는 해상도 기 API 로,SAX 를 실현 하 는 해상도 기(즉"SAX Parser")는 직렬 해상도 기의 형식 으로 이벤트 구동 API 를 가지 고 있다.사용자 가 리 셋 함 수 를 정의 하고 해석 할 때 이벤트 가 발생 하면 호출 됩 니 다.사건 은 모든 XML 특성 이 만 났 을 때 발생 하고 그들 을 만 났 을 때 다시 발생 한다.XML 속성 도 요소 이벤트 자료 의 일부분 으로 전 달 됩 니 다.SAX 처리 시 단 방향 성;해 석 된 자 료 는 다시 시작 하지 않 고 다시 읽 을 수 없습니다.
DOM
DOM 해상도 기 는 모든 처리 가 시작 되 기 전에 트 리 전 체 를 메모리 에 두 어야 하기 때문에 DOM 해상도 기의 메모리 사용량 은 입력 자료 의 크기(상대 적 으로 SAX 해상도 기의 메모리 내용 은 XML 파일 의 최대 깊이(XML 트 리 의 최대 깊이)와 단일 XML 항목 에 XML 속성 만 저장 하 는 최대 자료)입 니 다.
DOM 은 python 3.2 에서 두 가지 실현 방식 이 있 습 니 다.
1.xml.minidom 은 기본 적 인 실현 이다.
2.xml.puldom 은 필요 할 때 만 접근 하 는 하위 트 리 를 구축 합 니 다.
'''
Created on 2012-5-25
@author: salomon
'''
import xml.dom.minidom as minidom
dom = minidom.parse("E:\\test.xml")
root = dom.getElementsByTagName("Schools") #The function getElementsByTagName returns NodeList.
print(root.length)
for node in root:
print("Root element is %s。" %node.tagName)# , C 。
schools = node.getElementsByTagName("School")
for school in schools:
print(school.nodeName)
print(school.tagName)
print(school.getAttribute("Name"))
print(school.attributes["Name"].value)
classes = school.getElementsByTagName("Class")
print("There are %d classes in school %s" %(classes.length, school.getAttribute("Name")))
for mclass in classes:
print(mclass.getAttribute("Id"))
for student in mclass.getElementsByTagName("Student"):
print(student.attributes["Name"].value)
print(student.getElementsByTagName("English")[0].nodeValue) # ?
print(student.getElementsByTagName("English")[0].childNodes[0].nodeValue)
student.getElementsByTagName("English")[0].childNodes[0].nodeValue = 75
f = open('new.xml', 'w', encoding = 'utf-8')
dom.writexml(f,encoding = 'utf-8')
f.close()
ElementTree현재 찾 아 낸 Element Tree 의 정 보 는 비교적 적 으 며,현재 작업 메커니즘 을 알 수 없다.Element Tree 는 경량급 DOM 에 가 까 운 자료 가 있 지만 Element Tree 의 모든 Element 노드 의 작업 방식 은 일치 합 니 다.그것 은 C\#의 XpathNavigator 와 유사 합 니 다.
'''
Created on 2012-5-25
@author: salomon
'''
from xml.etree.ElementTree import ElementTree
tree = ElementTree()
tree.parse("E:\\test.xml")
root = tree.getroot()
print(root.tag)
print(root[0].tag)
print(root[0].attrib)
schools = root.getchildren()
for school in schools:
print(school.get("Name"))
classes = school.findall("Class")
for mclass in classes:
print(mclass.items())
print(mclass.keys())
print(mclass.attrib["Id"])
math = mclass.find("Student").find("Scores").find("Math")
print(math.text)
math.set("teacher", "bada")
tree.write("new.xml")
Compare:상기 몇 가지 점 에서 Expat 와 SAX 해석 XML 방식 이 같 지만 성능 이 어떤 지 모른다.DOM 은 상기 두 가지 해상도 기 에 비해 메모 리 를 소모 하고 액세스 시간 이 소모 되 기 때문에 파일 처리 가 상대 적 으로 느리다.파일 이 너무 커서 메모리 에 불 러 올 수 없다 면 DOM 이라는 해석 기 는 사용 할 수 없습니다.그러나 어떤 종류의 XML 인증 은 전체 파일 에 액세스 해 야 하거나 일부 XML 처리 가 전체 파일 에 만 액세스 해 야 할 때 DOM 은 유일한 선택 입 니 다.
Note:
지적 해 야 할 것 은 XML 에 액세스 하 는 이 몇 가지 기술 은 Python 이 독창적 인 것 이 아니 라 Python 도 다른 언어 를 참고 하거나 다른 언어 에서 직접 도입 한 것 이다.예 를 들 어 Expat 는 C 언어 로 개 발 된 XML 문 서 를 분석 하 는 개발 창고 이다.한편,SAX 는 처음에 David Megginson 이 자바 언어 로 개 발 했 고 DOM 은 플랫폼 과 언어 에 독립 된 방식 으로 문서 의 내용 과 구 조 를 방문 하고 수정 할 수 있 었 다.모든 프로 그래 밍 언어 에 사용 할 수 있 습 니 다.
대비 해서 나 도 C\#XML 문 서 를 액세스 하 는 방식 을 열거 하고 싶다.
1.DOM 기반 XmlDocument
2.스 트림 파일 기반 XmlReader 와 XmlWriter(SAX 스 트림 파일 과 달리 SAX 는 이벤트 구동 모델).
3. Linq to Xml
스 트림 파일 두 가지 모델:XmlReader/XML Writer VS SAX
스 트림 모델 은 매번 XML 문서 의 한 노드 를 교체 할 때마다 비교적 큰 문 서 를 처리 하 는 데 적합 하고 소모 되 는 메모리 공간 이 적다.스 트림 모델 에는 두 가지 변체 인'푸 시'모델 과'당 김'모델 이 있다.
푸 시 모델 은 흔히 말 하 는 SAX 입 니 다.SAX 는 이벤트 로 구동 되 는 모델 입 니 다.즉,하나의 노드 를 발견 할 때마다 푸 시 모델 로 사건 을 일 으 키 고 우 리 는 이 사건 들 의 처리 프로그램 을 작성 해 야 합 니 다.이런 방법 은 매우 유연 하지 않 고 번 거 롭 습 니 다.
.NET 에서 사용 하 는 것 은'당 김'모델 을 바탕 으로 하 는 실현 방안 이다.'당 김'모델 은 문 서 를 옮 겨 다 닐 때 관심 이 있 는 문서 부분 을 리더 에서 끌 어 내 고 사건 을 일 으 키 지 않 아 도 된다.우리 가 프로 그래 밍 방식 으로 문 서 를 방문 할 수 있 도록 해 준다.이것 은 유연성 을 크게 향상 시 켰 고'당 김'모델 은 선택 적 인 처리 노드 를 사용 할 수 있다.한편,SAX 는 한 노드 를 발견 할 때마다 클 라 이언 트 에 게 알려 주 고'당 김'모델 을 사용 하면 Application 의 전체적인 효율 을 높 일 수 있다.
PS:여기 서 xml 작업 에 관 한 온라인 도 구 를 몇 가지 더 제공 하여 참고 하 시기 바 랍 니 다.
온라인 XML/JSON 상호 변환 도구:
http://tools.jb51.net/code/xmljson
온라인 포맷 XML/온라인 압축 XML:
http://tools.jb51.net/code/xmlformat
XML 온라인 압축/포맷 도구:
http://tools.jb51.net/code/xml_format_compress
XML 코드 온라인 포맷 미화 도구:
http://tools.jb51.net/code/xmlcodeformat
파 이 썬 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.