2012-01-11 17 views
5

Tôi đang tạo một ứng dụng Android đọc XML Internet. Ứng dụng này sử dụng SAX để phân tích cú pháp XML. Đây là mã của tôi cho phần phân tích cú pháp:

public LectorSAX(String url){ 
    try{ 
     SAXParserFactory spf=SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 
     DefaultHandler lxmlr=new LibraryXMLReader() ; 
     sp.parse(url, lxmlr); 

     nodo=((LibraryXMLReader)lxmlr).getNodoActual(); 

    }catch(ParserConfigurationException e){ 
     System.err.println("Error de parseo en LectorSAX.java: "+e); 
    }catch(SAXException e){ 
     System.err.println("Error de sax LectorSAX.java: " + e); 
    } catch (IOException e){ 
     System.err.println("Error de io LectorSAX.java: " + e); 
    } 
} 

Vấn đề là SAXException xảy ra. Thông báo ngoại lệ như sau:

org.apache.harmony.xml.ExpatParser$ParseException: At line 4, column 42: not well-formed (invalid token)

Tuy nhiên, nếu tôi đặt cùng mã trong ứng dụng Java SE bình thường, ngoại lệ này không xảy ra và mọi thứ hoạt động tốt.

Tại sao cùng một mã hoạt động tốt trong ứng dụng Java SE chứ không phải Android ?. Mặt khác, Làm thế nào để giải quyết vấn đề ?.

Cảm ơn sự giúp đỡ.

Chúc mừng.

+0

Bạn có thể chia sẻ xml ur ... và theo lỗi có vấn đề với xml ur .. –

+0

@MohitSharma Nhưng tại sao cùng một mã hoạt động tốt trong ứng dụng Java SE chứ không phải Android ?. Đây là URL: http://www.aemet.es/xml/municipios/localidad_33002.xml – Lobo

+0

ban đầu tôi nghĩ rằng có một số vấn đề với xml ur theo lỗi .. nhưng nó không giống như vậy ... bây giờ chỉ có giải pháp với u là u có gỡ lỗi phân tích –

Trả lời

11

Đây có thể là sự cố mã hóa ký tự.
Như bạn có thể thấy, lỗi mã thông báo không hợp lệ sẽ trỏ đến dòng # 4.
Trong dòng này, bạn có thể tìm thấy dấu chấm (Meteorología) và dấu ngã (España). Tiêu đề XML hiển thị giá trị mã hóa ISO-8859-15. Vì nó ít phổ biến hơn mã UTF hoặc ISO-8859-1, điều này có thể dẫn đến lỗi khi SAXParser kết nối và cố chuyển đổi nội dung byte thành ký tự bằng cách sử dụng bộ mã mặc định hệ thống của bạn.

Sau đó, bạn sẽ cần phải thông báo cho SAXParser để sử dụng bộ ký tự nào. Một cách để làm như vậy, là chuyển một số InputSource, thay vì URL, sang phương thức phân tích cú pháp. Như một ví dụ:

SAXParserFactory factory = SAXParserFactory.newInstance(); 
SAXParser parser = factory.newSAXParser(); 

InputSource is = new InputSource(url); 
is.setEncoding("ISO-8859-15"); 

DefaultHandler lxmlr=new LibraryXMLReader() ; 
sp.parse(is, lxmlr); 

EDIT: Dường như Android VM không hỗ trợ mã hóa này, ném một ngoại lệ org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: unknown encoding.
Vì ISO-8859-15 chủ yếu tương thích với ISO-8859-1, ngoại trừ một số ký tự cụ thể (như bạn có thể thấy here), giải pháp thay đổi giá trị ISO-8859-15 thành ISO-8859-1 theo phương pháp setEncoding, buộc trình phân tích cú pháp sử dụng khác nhau nhưng tương thích mã hóa charset:

is.setEncoding("ISO-8859-1"); 

như có vẻ như, như Android không hỗ trợ charset tuyên bố, nó sử dụng mặc định của nó (UTF-8) và do đó phân tích cú pháp không thể sử dụng khai báo XML để chọn mã hóa apropiate.

+1

Hi @ tomas-narros, cảm ơn, tôi sẽ cố gắng và bạn sẽ nhận thấy kết quả. – Lobo

+3

Không nên trình phân tích cú pháp sử dụng khai báo XML một cách hợp lý để chọn mã hóa thích hợp? –

+1

Đó là một điểm tốt @JB. Để chắc chắn nó nên. Nhưng tôi khá chắc chắn rằng đây là một vấn đề mã hóa. –

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