Я использую саксофон Python для парсинга XML-файла. XML-файл является на самом деле комбинацией нескольких XML-файлов. Это похоже следующим образом:
<row name="abc" age="40" body="blalalala..." creationdate="03/10/10" />
<row name="bcd" age="50" body="blalalala..." creationdate="03/10/09" />
Мой код Python находится в следующем. Это показывает "спам после ошибки" элемента документа. Любая хорошая идея решить эту проблему.Спасибо.
from xml.sax.handler import ContentHandler
from xml.sax import make_parser,SAXException
import sys
class PostHandler (ContentHandler):
def __init__(self):
self.find = 0
self.buffer = ''
self.mapping={}
def startElement(self,name,attrs):
if name == 'row':
self.find = 1
self.body = attrs["body"]
print attrs["body"]
def character(self,data):
if self.find==1:
self.buffer+=data
def endElement(self,name):
if self.find == 1:
self.mapping[self.body] = self.buffer
print self.mapping
parser = make_parser()
handler = PostHandler()
parser.setContentHandler(handler)
try:
parser.parse(open("2.xml"))
except SAXException:
Похоже, у вас нет корневого элемента в вашем XML-файле. Оберните элементы строки в элемент одной строки.
xmldata = '''
<row name="abc" age="40" body="blalalala..." creationdate="03/10/10" />
<row name="bcd" age="50" body="blalalala..." creationdate="03/10/09" />
'''
Добавьте тег-обертку вокруг данных. Я использовал ElementTree, так как он проще, но вы сможете сделать то же самое на любом парсере:
from xml.etree import ElementTree as etree
# wrap the data
xmldata = '<rows>' +data + '</rows>'
rows = etree.fromstring(xmldata)
for row in rows:
print row.attrib
Results in
{'age': '40',
'body': 'blalalala...',
'creationdate': '03/10/10',
'name': 'abc'}
{'age': '50',
'body': 'blalalala...',
'creationdate': '03/10/09',
'name': 'bcd'}