2015-05-30 29 views
0

我想用使用SAX的Python解析XML文件。使用帶有sax的Python解析具有多個元素的XML

該文檔具有多個具有相同名稱的元素。我想打印元素的一些屬性,但是程序只是打印文檔中遇到的最後一個元素的屬性。

這是代碼:

# art.py 
import sys 

from xml.sax import make_parser 
from handlers import ArticleHandler 

ch = ArticleHandler() 
saxparser = make_parser() 

saxparser.setContentHandler(ch) 
saxparser.parse(sys.stdin) 

print "TYPE:", ch.TYPE 
print "SUBTYPE:" , ch.SUBTYPE 


# handlers.py 
from xml.sax.handler import ContentHandler 

class ArticleHandler(ContentHandler): 

TYPE = "" 
SUBTYPE = "" 

def startElement(self, name, attrs): 
    if name == "relation": 
     self.TYPE = attrs.get("TYPE", "") 
     self.SUBTYPE = attrs.get("SUBTYPE") 

這是XML:

<relation ID="CNN_CF_20030303.1900.00-R3" TYPE="ORG-AFF" SUBTYPE="Employment"> 
    ... 
    </relation> 
    <relation ID="CNN_CF_20030303.1900.00-R4" TYPE="ORG-AFF" SUBTYPE="Membership"> 
    ... 
    </relation> 

對於該輸入輸出是

TYPE:ORG-AFF 
    SUBTYPE:Membership 

而期望輸出是

TYPE:ORG-AFF 
    SUBTYPE:Employment 
    TYPE:ORG-AFF 
    SUBTYPE:Membership 

我該如何解決這個錯誤?

+0

我不是在蟒蛇很不錯,但它似乎對他們的屬性分配給ArticleHandler對象的字段的XML文件,每個標籤的程序調用ArticleHandler.startElement。所以,如果你有很多標籤,它會重新分配字段。在解析結束時,您只需打印最後一個標記的屬性即可解析。 – Nolan

+0

你爲什麼要使用SAX?即使你有內存限制阻止任何DOM方法,也有更好的API。例如,請參閱lxml中的'iterparse'函數。 –

回答

0

您必須重新編寫程序以處理多個關係標記,例如,通過使用列表

import sys 
from xml.sax import make_parser 
from xml.sax.handler import ContentHandler 

class ArticleHandler(ContentHandler): 
    def __init__(self): 
     self.relations = [] 

    def startElement(self, name, attrs): 
     if name == "relation": 
      self.relations.append((attrs.get("TYPE", ""), attrs.get("SUBTYPE")) 

ch = ArticleHandler() 
saxparser = make_parser() 
saxparser.setContentHandler(ch) 
saxparser.parse(sys.stdin) 

for type, subtype in ch.relations: 
    print "TYPE:", type 
    print "SUBTYPE:" , subtype