Я пытаюсь проанализировать 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
Как я могу исправить эту ошибку?
Я не очень хорошо на питоне, но мне кажется, ваш ArticleHandler.startElement программы вызова для каждого тега в файле XML, который присваивает их свойство полого объекта ArticleHandler. Таким образом, если у вас много меток, они будут переназначать поля. И в конце разбора вы просто распечатываете свойства последнего тега. – Nolan
Почему вы хотите использовать SAX? Даже если у вас есть ограничения в памяти, препятствующие любому подходу DOM, есть намного лучшие API. См., Например, функции 'iterparse' в lxml. –