2009-06-09 45 views
7

Tôi nhận được ngoại lệ sau trong khi phân tích cú pháp xml.Ký tự không hợp lệ '& # x0' gặp phải

Fatal error at line -1 Invalid character '&#x0' encountered. No stack trace 

Tôi có dữ liệu Xml ở định dạng chuỗi và tôi đang phân tích dữ liệu bằng trình phân tích cú pháp DOM. Tôi đang phân tích cú pháp dữ liệu là phản hồi từ máy chủ Java cho ứng dụng khách Blackberry. Tôi cũng đã thử phân tích cú pháp với trình phân tích SAX, nhưng vấn đề vẫn chưa được giải quyết. Xin vui lòng giúp đỡ.

+0

cho chúng ta thấy xml –

+0

giá trị giá trị giá trị giá trị XML là ở định dạng chuỗi – iOSDev

Trả lời

4

tôi có những giải pháp,

tôi chỉ cắt nó với trim() và nó làm việc hoàn toàn tốt đẹp với tôi.

+0

Có, có thể đó là do char "null" ở cuối chuỗi của bạn. Nhưng tôi nghĩ rằng solucion thực nên được sử dụng Thay thế của char "\ 0", và thay đổi nó cho một chuỗi rỗng. –

2

Có mùi giống như bạn đang cố gắng phân tích chuỗi trống dưới dạng XML. Bạn đã xác minh rằng khách hàng đang được cung cấp phản hồi tốt chưa?

+0

Có, tôi đã in các phản ứng đến từ các máy chủ. Không phải của nó. Bất cứ khi nào tôi "mã cứng" phản hồi chuỗi, trình phân tích cú pháp hoạt động tốt. Nhưng tôi không thể đáp ứng mã khó trong dự án thực sự của mình. Xin vui lòng giúp đỡ. – iOSDev

+0

Hãy làm rõ điều này - nếu bạn mã hóa nghiêm ngặt phản hồi của khách hàng, nhưng khi bạn sử dụng phản hồi từ máy chủ, bạn nhận được lỗi này? Đó là những gì bạn đang nói? – Andrew

+0

Có, bạn đã đúng. Mã hóa hoạt động tốt ... – iOSDev

0
InputStream xml = new ByteArrayInputStream(xmlData.getBytes()); 
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
Document doc = docBuilder.parse(xml); 
doc.getDocumentElement().normalize(); 
xml.close(); 

Phía trên là mã tôi đang sử dụng để phân tích cú pháp.

+0

Cảm ơn bạn đã chỉnh sửa mã cũng như hình thành – iOSDev

3

Mã của bạn hiện đang gọi getBytes() bằng cách sử dụng mã hóa mặc định nền tảng - rất hiếm khi là ý tưởng hay. Tìm hiểu xem mã hóa dữ liệu thực sự là gì và sử dụng nó. (Đó là khả năng là UTF-8.)

Nếu Blackberry bao gồm DocumentBuilder.parse(InputSource), đó sẽ là một lợi thế:

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
StringReader reader = new StringReader(xmlData); 
try { 
    Document doc = docBuilder.parse(xml); 
    doc.getDocumentElement().normalize(); 
} finally { 
    reader.close(); 
} 

Nếu điều đó không làm việc, có một rất cái nhìn cận cảnh chuỗi của bạn, ví dụ như thế này:

for (int i=0; i < xmlData.length(); i++) { 
    // Use whatever logging you have on the Blackberry 
    System.out.println((int) xmlData.charAt(i)); 
} 

Có thể là vấn đề đang đọc phản hồi từ máy chủ - nếu bạn đang đọc nó nặng, bạn có thể có Unicode null (\ u0000) trong chuỗi của bạn, có thể không xuất hiện rõ ràng trong log/debug output, nhưng sẽ gây ra lỗi mà bạn đã hiển thị.

EDIT: Tôi vừa thấy rằng bạn đang nhận được dữ liệu base64 ở vị trí đầu tiên - vậy tại sao chuyển đổi nó thành chuỗi và sau đó quay lại byte? Chỉ cần giải mã base64 thành một mảng byte và sau đó sử dụng nó làm cơ sở cho ByteArrayInputStream của bạn. Sau đó, bạn không bao giờ phải đối phó với một mã hóa văn bản ở nơi đầu tiên.

+0

Ngoài ra, làm cách nào để kiểm tra xem tôi có \ u0000 trong chuỗi không? Tôi mới để xử lý xml, Có cách nào để chk.? Xin vui lòng giúp đỡ. – iOSDev

+2

Nhìn vào đoạn mã thứ hai - nó cho thấy cách kiểm tra chuỗi theo cách thủ công. Bạn có thể sử dụng xmlData.indexOf ("\ u0000") để kiểm tra theo chương trình. –

+0

Giải pháp nào? Và bạn đã kiểm tra chuỗi? Nó sẽ giúp ích nếu bạn đưa ra nhiều chi tiết hơn trong câu hỏi. –

1

Bạn đang sử dụng mã hóa ký tự nào? Có thể nào là Unicode được sử dụng và BOM được gửi ngay từ đầu?

+0

Phản hồi đến từ máy chủ là mã hóa Base64, mà tôi giải mã ở phía máy khách. – iOSDev

12

Bạn có một ký tự rỗng trong luồng ký tự của mình, nghĩa là char (0) không hợp lệ trong tài liệu XML. Nếu điều này không có trong chuỗi gốc thì rất có thể đó là vấn đề giải mã ký tự.

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