XML은 Extensible Markup Language(eXtensible Markup Language)을 의미합니다.
XML은 데이터를 전송하고 저장하도록 설계되었습니다.
XML은 문서를 구성 요소로 나누고 해당 구성 요소를 식별하는 의미적 마크업을 정의하는 규칙 집합입니다.
메타 마크업 언어이기도 합니다. 즉, 특정 필드와 관련된 다른 의미론적, 구조적 마크업 언어를 정의하기 위한 구문 언어를 정의합니다.
공통 XML프로그래밍인터페이스DOM과 SAX가 있는데 이 두 가지가 두 인터페이스는 XML 파일을 서로 다른 방식으로 처리하며 물론 사용 시나리오도 다릅니다.
Python에는 XML, SAX, DOM 및 ElementTree를 구문 분석하는 세 가지 방법이 있습니다.
python 표준 라이브러리에는 SAX 파서가 포함되어 있습니다. SAX는 이벤트를 사용하여 이벤트를 하나씩 트리거하고 실행 중에 사용자를 호출하여 모델을 구동합니다. XML 파일을 처리하는 콜백 함수 를 정의합니다.
Manipulate를 통해 XML 데이터를 메모리의 트리로 구문 분석합니다. 트리 작업을 사용하는 XML.
ElementTree는 편리하고 친숙한 API를 갖춘 경량 DOM과 같습니다. 코드는 유용성이 좋고 빠르며 메모리를 덜 소모합니다.
참고: DOM은 XML 데이터를 메모리의 트리에 매핑해야 하기 때문에 첫째로 상대적으로 느리고 둘째로 더 많은 메모리를 소비하는 반면 SAX 스트리밍은 XML 파일을 읽습니다. 메모리를 덜 차지하지만 사용자가 콜백 기능을 구현해야 합니다(handler).
이 장에서 사용된 XML 예제 파일 movie.xml의 내용은 다음과 같습니다.
<collection shelf="New Arrivals"><movie title="Enemy Behind"> <type>War, Thriller</type> <format>DVD</format> <year>2003</year> <rating>PG</rating> <stars>10</stars> <description>Talk about a US-Japan war</description></movie><movie title="Transformers"> <type>Anime, Science Fiction</type> <format>DVD</format> <year>1989</year> <rating>R</rating> <stars>8</stars> <description>A schientific fiction</description></movie> <movie title="Trigun"> <type>Anime, Action</type> <format>DVD</format> <episodes>4</episodes> <rating>PG</rating> <stars>10</stars> <description>Vash the Stampede!</description></movie><movie title="Ishtar"> <type>Comedy</type> <format>VHS</format> <rating>PG</rating> <stars>2</stars> <description>Viewable boredom</description></movie></collection>
SAX는 이벤트입니다. 기반 API.
SAX를 사용하여 XML 문서를 구문 분석하는 작업에는 구문 분석기와 이벤트 핸들러라는 두 부분이 포함됩니다.
파서는 XML 문서를 읽고 요소 시작 및 요소 종료 이벤트와 같은 이벤트를 이벤트 프로세서에 보내는 역할을 담당합니다.
이벤트 프로세서는 이벤트에 대한 응답과 전달을 담당합니다. XML 데이터가 처리됩니다.
1. 대용량 파일을 처리합니다.
2. 파일의 일부만 필요하거나 파일의 특정 정보만 필요합니다.
3. 나만의 객체 모델을 만들고 싶을 때.
sax를 사용하여 Python에서 xml을 처리하려면 먼저 xml.sax의 구문 분석 기능과 xml.sax.handler의 ContentHandler를 도입해야 합니다.
문자(콘텐츠) 메서드
호출 타이밍:
문자를 만나기 전에 줄부터 시작합니다. label , 문자가 있고 content의 값은 문자열 입니다.
한 태그에서 다음 태그를 만나기 전에 문자가 있고, 콘텐츠의 값은 이 문자열입니다.
태그에는 줄 종결자를 만나기 전의 문자가 있으며, 내용의 값은 이 문자열입니다.
태그는 시작 태그 또는 종료 태그일 수 있습니다.
startDocument() 메서드
는 문서가 시작될 때 호출됩니다.
endDocument() 메서드
는 파서가 문서의 끝에 도달하면 호출됩니다.
startElement(name, attrs) 메소드
는 XML 시작 태그가 발견될 때 호출됩니다. name은 태그의 이름이고 attrs는 태그의 속성 가치 사전.
endElement(name) 메소드
는 XML 종료 태그가 발견되면 호출됩니다.
다음 메소드는 새로운 파서 객체를 생성하고 이를 반환합니다.
xml.sax.make_parser( [parser_list] )
매개변수 설명:
parser_list - 선택적 매개변수, 파서 목록
다음 메서드는 SAX 파서를 생성하고 xml 문서를 파싱합니다.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
매개변수 설명:
xmlfile - xml 파일 이름
contenthandler - ContentHandler 객체여야 합니다
errorhandler - 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
parseString方法创建一个XML解析器并解析xml字符串:
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
参数说明:
xmlstring - xml字符串
contenthandler - 必须是一个ContentHandler的对象
errorhandler - 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
#!/usr/bin/python# -*- coding: UTF-8 -*-import xml.saxclass MovieHandler( xml.sax.ContentHandler ): def init(self): self.CurrentData = "" self.type = "" self.format = "" self.year = "" self.rating = "" self.stars = "" self.description = "" # 元素开始事件处理 def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print "*****Movie*****" title = attributes["title"] print "Title:", title # 元素结束事件处理 def endElement(self, tag): if self.CurrentData == "type": print "Type:", self.type elif self.CurrentData == "format": print "Format:", self.format elif self.CurrentData == "year": print "Year:", self.year elif self.CurrentData == "rating": print "Rating:", self.rating elif self.CurrentData == "stars": print "Stars:", self.stars elif self.CurrentData == "description": print "Description:", self.description self.CurrentData = "" # 内容事件处理 def characters(self, content): if self.CurrentData == "type": self.type = content elif self.CurrentData == "format": self.format = content elif self.CurrentData == "year": self.year = content elif self.CurrentData == "rating": self.rating = content elif self.CurrentData == "stars": self.stars = content elif self.CurrentData == "description": self.description = content if ( name == "main"): # 创建一个 XMLReader parser = xml.sax.make_parser() # turn off namepsaces parser.setFeature(xml.sax.handler.feature_namespaces, 0) # 重写 ContextHandler Handler = MovieHandler() parser.setContentHandler( Handler ) parser.parse("movies.xml")
以上代码执行结果如下:
*****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDYear: 2003Rating: PGStars: 10Description: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDYear: 1989Rating: RStars: 8Description: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGStars: 10Description: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGStars: 2Description: Viewable boredom
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
python中用xml.dom.minidom来解析xml文件,实例如下:
#!/usr/bin/python# -*- coding: UTF-8 -*-from xml.dom.minidom import parseimport xml.dom.minidom# 使用minidom解析器打开 XML 文档DOMTree = xml.dom.minidom.parse("movies.xml")collection = DOMTree.documentElementif collection.hasAttribute("shelf"): print "Root element : %s" % collection.getAttribute("shelf")# 在集合中获取所有电影movies = collection.getElementsByTagName("movie")# 打印每部电影的详细信息for movie in movies: print "*****Movie*****" if movie.hasAttribute("title"): print "Title: %s" % movie.getAttribute("title") type = movie.getElementsByTagName('type')[0] print "Type: %s" % type.childNodes[0].data format = movie.getElementsByTagName('format')[0] print "Format: %s" % format.childNodes[0].data rating = movie.getElementsByTagName('rating')[0] print "Rating: %s" % rating.childNodes[0].data description = movie.getElementsByTagName('description')[0] print "Description: %s" % description.childNodes[0].data
以上程序执行结果如下:
Root element : New Arrivals*****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDRating: PGDescription: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDRating: RDescription: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGDescription: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGDescription: Viewable boredom
위 내용은 Python의 XML 구문 분석에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!