2010-04-08 140 views
47

Tôi đang viết một chương trình bằng Java có một tệp XML tùy chỉnh và phân tích nó. Tôi đang sử dụng tệp XML để lưu trữ. Tôi nhận được lỗi sau trong Eclipse.Tài liệu XML phân tích cú pháp Java cho "Nội dung không được phép trong prolog". lỗi

[Fatal Error] :1:1: Content is not allowed in prolog. 
org.xml.sax.SAXParseException: Content is not allowed in prolog. 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:239) 
    at  com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283 ) 
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:208) 
    at me.ericso.psusoc.RequirementSatisfier.parseXML(RequirementSatisfier.java:61) 
    at me.ericso.psusoc.RequirementSatisfier.getCourses(RequirementSatisfier.java:35) 
    at  me.ericso.psusoc.programs.RequirementSatisfierProgram.main(RequirementSatisfierProgram.java:23 ) 

Sự khởi đầu của tập tin XML được bao gồm: Chương trình

<?xml version="1.0" ?> 
<PSU> 
    <Major id="IST"> 
     <name>Information Science and Technology</name> 
     <degree>B.S.</degree> 
     <option> Information Systems: Design and Development Option</option> 
     <requirements> 
      <firstlevel type="General_Education" credits="45"> 
       <component type="Writing_Speaking">GWS</component> 
       <component type="Quantification">GQ</component> 

là khả năng đọc trong file XML nhưng khi tôi gọi DocumentBuilder.parse(XMLFile) để có được một phân tích cú pháp org.w3c.dom.Document, tôi nhận được lỗi trên.

Dường như tôi không có nội dung không hợp lệ trong phần mở đầu của tệp XML của tôi. Tôi không thể tìm ra điều gì sai. Hãy giúp tôi. Cảm ơn.

+2

Tôi đã tìm thấy lỗi của mình. Tôi đã đọc trong thư mục tập tin đã ở trong và không phải là tập tin chính nó.Rõ ràng nếu bạn đọc trong một thư mục dưới dạng một tệp và gọi tệp File.exists() trên đó, nó sẽ vẫn trả về true. Stupid tôi ... Cảm ơn tất cả sự giúp đỡ. – ericso

+0

kiểm tra câu trả lời của tôi tại http://stackoverflow.com/questions/3665554/about-saxparseexception-content-is-not-allowed-in-prolog/7023984 hoặc chỉ cần kiểm tra liên kết này http://mark.koli.ch/2009 /02/resolving-orgxmlsaxsaxparseexception-content-is-not-allowed-in-prolog.html – Starfish

+0

không biết nếu nó sẽ giúp bất cứ ai nhưng tôi đã nhận lỗi này cố gắng sử dụng flavorDimensions và đặt drawable-xhdpi dưới res trong hương vị của tôi. Khi tôi đã thay đổi nó thành drawable .. tất cả cố định – dangalg

Trả lời

3

Tài liệu có vẻ ổn với tôi nhưng tôi nghi ngờ rằng nó chứa các ký tự ẩn. Mở nó trong trình soạn thảo hex để kiểm tra xem có thực sự không có gì trước "<" đầu tiên không. Đảm bảo các khoảng trống trong tiêu đề XML là khoảng trắng. Có thể xóa không gian trước "?>". Kiểm tra ngắt dòng nào được sử dụng.

Đảm bảo tài liệu là đúng UTF-8. Một số trình chỉnh sửa cửa sổ lưu tài liệu dưới dạng UTF-16 (tức là mỗi byte thứ hai là 0).

+0

Tôi đã chỉnh sửa tệp XML trong trình soạn thảo văn bản Eclipse. Tôi đang ở trên máy Mac và tôi cũng sử dụng BBEdit. Tôi sẽ kiểm tra các ký tự vô hình. – ericso

+0

Tôi đã kiểm tra các ký tự vô hình trong BBEdit (Xem> Hiển thị văn bản> Hiển thị Invisibles) và tôi không thấy bất kỳ ký tự vô hình nào trong khai báo XML. Tôi cũng đã xóa khoảng trống ở cuối khai báo. Tôi đã thêm mã hóa = "UTF-8" và mã hóa = "UTF-16 và tôi vẫn gặp lỗi. – ericso

+0

Mã hóa tệp là gì? Tức là không phải những gì bạn nghĩ nhưng trình soạn thảo của bạn nói gì? –

7

Đảm bảo không có khoảng trắng ẩn ở đầu tệp XML của bạn. Cũng có thể bao gồm mã hóa = "UTF-8" (hoặc 16? Không có đầu mối) trong nút.

+1

Rất tiếc, đây không phải là nguyên nhân chính gây ra. – Esko

+0

Đã kiểm tra trong BBEdit cho các ký tự ẩn và thêm thuộc tính encoding vào khai báo XML. Cả hai đều không sửa chữa nó. – ericso

0

Nếu bạn có thể kiểm soát các tập tin xml, hãy thử thêm một chút thông tin đến đầu của tập tin:

<?xml version="1.0" encoding="UTF-16" standalone="no"?> 
+0

Tôi đã thêm cả hai standalone = "no" và standalone = "yes". Cả hai đều cho tôi lỗi tương tự. – ericso

+2

hmmm ... điều tiếp theo tôi muốn thử là sức mạnh vũ phu - cố gắng lấy một tài liệu giả thông qua trình phân tích cú pháp, sau đó từ từ thêm các phần của tài liệu gốc của bạn cho đến khi bạn có thể xác định được vấn đề. Tôi đã đi xuống con đường đó trước đây :-) –

0

Kiểm tra bất kỳ vấn đề cú pháp trong file XML. Tôi đã tìm thấy lỗi này khi làm việc trên xsl/xsp với Cocoon và tôi xác định một biến bằng cách sử dụng một nút không tồn tại hoặc một cái gì đó như thế. Kiểm tra toàn bộ XML.

+0

Tôi gặp lỗi trước khi tôi có thể làm bất kỳ điều gì với tài liệu được phân tích cú pháp. Nó không thành công khi tôi gọi DocumentBuilder.parse (XMLFile). Tôi đã chạy tệp XML thông qua trình xác thực XML (xmlvalidation.com) và nó đã trải qua rất tốt. – ericso

+0

Tệp có sẵn ở vị trí được chỉ định không? Có lẽ chương trình của bạn không thể truy cập nội dung của tệp và trình phân tích cú pháp chỉ nói những gì nó tìm thấy không phải là xml hợp lệ ... chỉ cần đoán. – Alfabravo

+0

@Alfabravo hơi khác nhau câu hỏi, bạn có biết nếu tôi nhận được một lỗi phân tích cú pháp như thế nào tôi có thể bắt ngoại lệ này. Trình xây dựng tài liệu trong java, không ném ngoại lệ thay vì in trên dòng lỗi, vì vậy làm thế nào tôi có thể thông báo cho người dùng nếu tập tin bị hỏng được cung cấp ?? –

19

Vui lòng kiểm tra tệp xml cho dù tệp có bất kỳ ký tự rác nào như thế này .If tồn tại, vui lòng sử dụng cú pháp sau để loại bỏ điều đó.

String XString = writer.toString(); 
XString = XString.replaceAll("[^\\x20-\\x7e]", ""); 
+2

Tôi thấy kỹ thuật này thực sự đơn giản là khá hữu ích như một sửa chữa nhanh chóng. Tuy nhiên, để giữ các dòng mới, bạn có thể thích regex 'replaceAll (" [^ \\ x20 - \\ x7e \\ x0A] "," ");' – Patrick

1

Tôi giả sử bạn có mã hóa xml thích hợp và khớp với Lược đồ.

Nếu bạn vẫn gặp phải lỗi này, hãy kiểm tra mã để loại bỏ xml và loại đầu vào bạn đã sử dụng. Bởi vì các tài liệu XML khai báo mã hóa riêng của chúng, nên tạo đối tượng StreamSource từ InputStream thay vì từ Reader, để bộ xử lý XML có thể xử lý chính xác mã được khai báo [Ref Book: Java in A Nutshell]

Hy vọng điều này giúp!

8

Tôi nghĩ đây cũng là giải pháp cho vấn đề này.

Thay đổi loại tài liệu của bạn từ 'Mã hóa theo UTF-8' Để 'Mã hóa theo UTF-8 mà không BOM'

tôi đã giải quyết vấn đề của tôi bằng cách làm thay đổi tương tự.

1

Bạn không cung cấp địa chỉ chính xác cho tệp. Bạn cần cung cấp một địa chỉ như C:/Users/xyz/Desktop/myfile.xml

+0

OP tìm thấy nó và chỉ ra nó trong phần bình luận trên câu hỏi – kolossus

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