2015-05-30 3 views
0

Я пытаюсь проанализировать XML-файл с помощью Python с помощью SAX.Разбор XML с несколькими элементами с использованием Python с sax

Документ имеет несколько элементов с тем же именем. Я хочу напечатать некоторые атрибуты элементов, но программа просто печатает атрибуты последнего элемента, встречающегося в документе.

Это код:

# 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.startElement программы вызова для каждого тега в файле XML, который присваивает их свойство полого объекта ArticleHandler. Таким образом, если у вас много меток, они будут переназначать поля. И в конце разбора вы просто распечатываете свойства последнего тега. – Nolan

+0

Почему вы хотите использовать SAX? Даже если у вас есть ограничения в памяти, препятствующие любому подходу DOM, есть намного лучшие API. См., Например, функции 'iterparse' в lxml. –

ответ

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 
Смежные вопросы