2014-10-02 2 views
0

모든 내용을 제 목구에 저장하고 싶습니다. 마지막 항목을 제외한 거의 모든 것을 잡을 수 있습니다. 이 같은Dict에있는 모든 xml 구문 분석을 파이썬으로 저장하십시오.

내 파이썬의 코드 모양이 같은

#!/usr/bin/python 

import xml.sax 

class MovieHandler(xml.sax.ContentHandler): 
    def __init__(self): 
     self.item = {} 
     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": 
     #if self.item: 
     print self.item 
     print "*****Movie*****" 
     title = attributes["title"] 
     print "Title:", title 

    # Call when an elements ends 
    def endElement(self, tag): 
     if self.CurrentData == "type": 
     self.item["type"] = self.type 
     #print "Type:", self.type 
     elif self.CurrentData == "format": 
     self.item["format"] = self.format 
     #print "Format:", self.format 
     elif self.CurrentData == "year": 
     self.item["year"] = self.year 
     #print "Year:", self.year 
     elif self.CurrentData == "rating": 
     self.item["rating"] = self.rating 
     #print "Rating:", self.rating 
     elif self.CurrentData == "stars": 
     self.item["stars"] = self.stars 
     #print "Stars:", self.stars 
     elif self.CurrentData == "description": 
     self.item["description"] = self.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") 

내 xml 파일의 모양을

<collection shelf="New Arrivals"> 
<movie title="Enemy Behind"> 
    <type>War, Thriller</type> 
    <format>DVD</format> 
self.date = "" <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><![CDATA[Neuilly-sur-Seine]]></type> 
    <format>VHS</format> 
    <rating>PG</rating> 
    <stars>2</stars> 
    <description>Viewable boredom</description> 
</movie> 
</collection> 

마지막 태그에서, 나는 아무런 정보가 없습니다.

어떻게이 문제를 해결할 수 있습니까? 미리 감사드립니다.

+1

어쩌면 예상되는 출력이 어떻게 될지 말하기 시작해야할까요? 다른 유형의 파서 (예 :'xml.etree.ElementTree')를 사용하는 것이 더 나을 가능성이 큽니다. – mgilson

답변

0

ElementTree을 사용하면이 문제가 간단 해집니다. 예를 들어 : 여기에서

import xml.etree.ElementTree as ET 
tree = ET.fromstring(s) # s is a string with the xml data. 
movies = tree.iter('movie') 
dct = {} 
for element in movies: 
    dct[element.attrib['title']] = element 
print dct # {'Transformers': <Element 'movie' at 0x7f8f40d6e750>, 'Ishtar': <Element 'movie' at 0x7f8f40d6eb50>, 'Enemy Behind': <Element 'movie' at 0x7f8f40d6e2d0>, 'Trigun': <Element 'movie' at 0x7f8f40d6e990>} 
print {element.tag: element.text for element in dct['Transformers']} # {'rating': 'R', 'description': 'A schientific fiction', 'format': 'DVD', 'stars': '8', 'year': '1989', 'type': 'Anime, Science Fiction'} 

, 잘하면 당신이 반복적으로 분석 할 필요가 대용량 파일이있을 때 sax 정말 빛나는

하는 것으로 ... 당신의 요구에 적합하게 수정 너무 어렵지 않다. 모든 데이터를 한꺼번에 저장하려면 보통 ElementTree을 사용하면 더 쉽게 작업 할 수 있습니다.

관련 문제