2010-04-04 23 views
6

Tôi sử dụng python sax để phân tích cú pháp tệp xml. Tệp xml thực sự là sự kết hợp của nhiều tệp xml. Có vẻ như sau:lỗi python sax "rác sau phần tử tài liệu"

<row name="abc" age="40" body="blalalala..." creationdate="03/10/10" /> 
<row name="bcd" age="50" body="blalalala..." creationdate="03/10/09" /> 

Mã trăn của tôi là như sau. Nó hiển thị lỗi "rác sau phần tử tài liệu". Bất kỳ ý tưởng tốt để giải quyết vấn đề này. Cảm ơn.

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: 
+0

+1 Tôi đã gặp lỗi chính xác này và câu hỏi này đã giúp tôi. Không thể tìm ra phần tử gốc bị thiếu trong lỗi "phần tử sau khi phần tử tài liệu": D –

Trả lời

11
xmldata = ''' 
<row name="abc" age="40" body="blalalala..." creationdate="03/10/10" /> 
<row name="bcd" age="50" body="blalalala..." creationdate="03/10/09" /> 
''' 

Thêm một thẻ wrapper quanh dữ liệu. Tôi đã sử dụng ElementTree vì nó rất đơn giản, nhưng bạn muốn có thể làm tương tự trên bất kỳ phân tích cú pháp:

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 

Kết quả trong

{'age': '40', 
'body': 'blalalala...', 
'creationdate': '03/10/10', 
'name': 'abc'} 
{'age': '50', 
'body': 'blalalala...', 
'creationdate': '03/10/09', 
'name': 'bcd'} 
4

Có vẻ rằng bạn không có phần tử gốc trong của bạn Tệp XML. Bọc các phần tử hàng của bạn vào phần tử hàng đơn.

Các vấn đề liên quan