Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 SAX API로 XML 구문 분석

<시간/>

SAX는 이벤트 기반 XML 구문 분석을 위한 표준 인터페이스입니다. SAX로 XML을 구문 분석하려면 일반적으로 xml.sax.ContentHandler를 서브클래싱하여 고유한 ContentHandler를 생성해야 합니다.

ContentHandler는 XML 풍미의 특정 태그와 속성을 처리합니다. ContentHandler 객체는 다양한 구문 분석 이벤트를 처리하는 메서드를 제공합니다. 소유하는 파서는 XML 파일을 파싱할 때 ContentHandler 메소드를 호출합니다.

startDocument 및 endDocument 메서드는 XML 파일의 시작과 끝에서 호출됩니다. 문자(text) 메서드는 매개변수 text를 통해 XML 파일의 문자 데이터를 전달합니다.

ContentHandler는 각 요소의 시작과 끝에서 호출됩니다. 파서가 네임스페이스 모드가 아니면 startElement(tag, attributes) 및 endElement(tag) 메서드가 호출됩니다. 그렇지 않으면 해당 메소드 startElementNS 및 endElementNS가 호출됩니다. 여기서 tag는 요소 태그이고 속성은 Attributes 개체입니다.

진행하기 전에 이해해야 할 다른 중요한 방법은 다음과 같습니다. −

make_parser 메소드

다음 메소드는 새로운 파서 객체를 생성하고 반환합니다. 생성된 파서 개체는 시스템이 찾은 첫 번째 파서 유형이 됩니다.

xml.sax.make_parser( [parser_list] )

다음은 매개변수의 세부사항입니다 -

  • 파서_목록 − 모두 make_parser 메소드를 구현해야 하는 사용할 파서 목록으로 구성된 선택적 인수.

파싱 방법

다음 메소드는 SAX 파서를 생성하고 이를 사용하여 문서를 파싱합니다.

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

다음은 매개변수의 세부사항입니다 -

  • xml파일 − 읽을 XML 파일의 이름입니다.
  • 콘텐츠 처리기 − ContentHandler 객체여야 합니다.
  • 오류 처리기 − 지정된 경우 errorhandler는 SAX ErrorHandler 객체여야 합니다.

parseString 메소드

SAX 파서를 만들고 지정된 XML 문자열을 구문 분석하는 방법이 하나 더 있습니다. .

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

다음은 매개변수의 세부사항입니다 -

  • xmlstring − 읽을 XML 문자열의 이름입니다.
  • 콘텐츠 처리기 − ContentHandler 객체여야 합니다.
  • 오류 처리기 − 지정된 경우 errorhandler는 SAX ErrorHandler 객체여야 합니다.

#!/usr/bin/python
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
   self.CurrentData = tag
      if tag == "movie":
         print "*****Movie*****"
         title = attributes["title"]
         print "Title:", title

# Call when an elements ends
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 = ""

   # Call when a character is read
   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__"):

   # create an XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)
   # override the default ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")

이것은 다음 결과를 생성합니다 -

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

SAX API 문서에 대한 자세한 내용은 표준 Python SAX API를 참조하세요.