2012-04-23 19 views
16

Tôi duy trì JDOM project và tôi đang cố gắng 'chứng nhận' trên Android. Hầu hết mọi thứ hoạt động tốt, nhưng xác thực lược đồ XML đang chứng minh sự cố ...Xác thực XMLSchema trên Android

Câu hỏi của tôi là: Có cách nào để xác thực XMLSchema trên Android không? Nếu có, làm thế nào?

câu hỏi như thế này đã được yêu cầu trước đó, nhưng không có câu trả lời thuyết phục được đưa ra:

Đây là những gì tôi đang 'biết' (chính xác cho tôi nếu tôi sai) ...:

  • SchemaFactory.newInstance ("http://www.w3.org/2001/XMLSchema ") - không thành công với IllegalArgumentException
  • mặc định 'ExpatParser' trong Android từ dự án Harmony không hỗ trợ xác thực XMLSchema.
  • Có thể tải Xerces trong ứng dụng Android và thậm chí là phân tích cú pháp với ứng dụng Android, nhưng không thực hiện việc phân tích Xác thực phân tích - khi bạn thử nhận được ngoại lệ Android 'FATAL' gây ra sự cố ứng dụng.

tôi đã làm việc về vấn đề này trong một thời gian bây giờ, và tôi đã đặt lại với nhau sau 'nghiên cứu':

Nếu ai có nữa thông tin về Xác thực XMLSchema trên Android Tôi sẽ đánh giá rất cao bất kỳ đầu vào nào cả.

Nếu ai đó đã thực hiện thành công xác thực XMLSchema trên XML và có thể giúp tôi có được chức năng làm việc cho JDOM, họ sẽ nhận được hàng nghìn điểm internet ... ;-) và sẽ được bất tử trong mã JDOM và cam kết tin nhắn.

+0

Hãy thử http://stackoverflow.com/questions/9998134/validate-xml-against-schema-on-android-using-xerces – LeoMobDev

Trả lời

-1

Tôi nghĩ bạn có thể sử dụng RelaxNG - có rất nhiều trình xác thực khả dụng. http://relaxng.org/#validators

Quan tâm đặc biệt nên - http://www.kohsuke.org/relaxng/bali/doc/ - https://msv.java.net/ - http://www.davidashen.net/rnv.html

Sau đó là thực hiện C, hai đầu tiên được viết bằng Java.

Nếu bạn cần hiệu suất cao, bạn có thể viết một số mã JNI và gọi các hàm trong nguồn rnv. Một cách tiếp cận đơn giản hơn là chỉ cần xây dựng rnv cho Android, sử dụng NDK và sau đó gọi nó là thực thi với các tham số.

Something như

Process p = Runtime.exec("/path/to/rnv/exec", [valdidationDoc: String, some more params]); 
OutputStream out = p.getOutputStream(); // connected to STDIN of p 
InputStream in = p.getInputStream(); // connected to STDOUT of p 
out.write(new FileInputStream("/path/to/xml")); 

/// read in for succes/errors 
+0

Cảm ơn bạn đã xem qua. Tôi đã yêu cầu xác thực XMLSchema một cách rõ ràng. Gợi ý RelaxNG sẽ không giúp tôi xác thực với XMLSchemas. – rolfl

+0

Ngày Xấu? Không, không phải là một ngày tồi tệ. Cam ơn vi đa hỏi. Tôi nghĩ rằng bạn đang thiếu những hàm ý của câu đầu tiên trong câu hỏi của tôi. JDOM là một thư viện chỉ java, và không thể giới thiệu các phụ thuộc không phải java. Đề xuất các giải pháp JNI hoặc các giải pháp từ bên ngoài đến Java không hữu ích. – rolfl

+0

Còn xmllint thì sao? http://xmlsoft.org/xmllint.html – fabian

0

Tôi đang sử dụng

javax.xml.parsers.DocumentBuilder; 
javax.xml.parsers.DocumentBuilderFactory; 
javax.xml.parsers.ParserConfigurationException; 

Nếu bạn có một chuỗi XML, bạn có thể phân tích nó theo:

Document doc = null; 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
InputSource is = new InputSource(); 
is.setCharacterStream(new StringReader(xml)); 
doc = db.parse(is); 

xin đừng quên việc xử lý ngoại lệ .

+1

Các op rõ ràng là yêu cầu xác nhận đối với một lược đồ, không chỉ phân tích cú pháp! – juwi

2

Tôi thích thú rằng, sau vài năm, điều này vẫn là một vấn đề mở. Mặc dù vậy, dường như có tin xấu. Theo AOSP Issue Tracker Schema xác nhận hiện nay dường như không được hỗ trợ với các API tiêu chuẩn của Android và Google có vẻ là không muốn sửa chữa nó:

API XML của chúng tôi (bao gồm cả SAX, XmlPull và DOM) không hỗ trợ bất kỳ sau :

XML Schema 

XML DTDs (including external entity declarations and references) 
validation 

element content whitespace 

Tuy nhiên, một commenter của cùng một vé tham chiếu một workaround, và cung cấp mã ví dụ sử dụng một cổng Xerces. Tôi không biết nếu điều này vượt xa những gì bạn đã tìm ra, cho đến nay, nhưng tôi hy vọng nó sẽ giúp.

Để quấn này: Các SchemaFactoryFinder chỉ biết các định nghĩa lược đồ sau:

Sử dụng bất kỳ nguyên nhân định nghĩa schema khác nó để thất bại (Tuy nhiên nó sẽ đăng nhập này trên cấp độ gỡ lỗi). Rõ ràng đây là trường hợp của bạn, vì bạn đang sử dụng một tham chiếu khác đến lược đồ 2011. Vì vậy, "chính xác" tham chiếu Định nghĩa lược đồ nên khắc phục vấn đề này.

+1

Thú vị cập nhật, tôi đang cố gắng để tiêu hóa những gì bạn có ở đó .... nó dường như chỉ là một liên kết đến một thư viện mật mã mà nội bộ xây dựng lại một bộ phân tích Xerces hoàn chỉnh như là một phụ thuộc. Đây là một tình huống khó khăn, bởi vì nó đòi hỏi phải kéo một tập hợp con của một dự án hiện có, và sẽ yêu cầu tôi phải duy trì trình phân tích cú pháp đầy đủ. Đây là một dẫn đầu thú vị, nhưng không phải là một giải pháp, ít nhất là theo như tôi có thể nói. – rolfl

+0

Vâng, tôi đã đoán. Ngoài ra, hãy kiểm tra kỹ với cơ sở mã của chúng tôi. Chúng tôi thực hiện một số phân tích cú pháp XML ở đây và ở đó, nhưng không có xác nhận nào diễn ra, ở bất kỳ đâu. Tôi không thể thực sự quấn quanh đầu tôi. Sẽ kiểm tra triển khai thực tế trong libcore và xem whats there – juwi

+0

Thực ra ... Tôi nghĩ rằng tôi đã tìm thấy sự cố: https://android.googlesource.com/platform/libcore/+/master/luni/src /main/java/javax/xml/validation/SchemaFactoryFinder.java Dòng 237ff. – juwi