2012-04-23 10 views
16

मैं JDOM project बनाए रखता हूं और मैं इसे एंड्रॉइड पर 'प्रमाणित' करने का प्रयास कर रहा हूं। अधिकांश चीजें ठीक काम करती हैं, लेकिन एक्सएमएल स्कीमा सत्यापन समस्याग्रस्त साबित हो रहा है ...एंड्रॉइड पर XMLSchema सत्यापन

मेरे प्रश्न हैं: क्या Android पर XMLSchema सत्यापन करने का कोई तरीका है? अगर वहाँ है, तो कैसे?

इस तरह सवाल से पहले कहा है कि है, लेकिन कोई निर्णायक जवाब दिया जाता है:

यह मैं वर्तमान में क्या 'पता' (मुझे ठीक कर लें मैं कर रहा हूँ है गलत) ...:

  • SchemaFactory.newInstance ("http://www.w3.org/2001/XMLSchema ") - IllegalArgumentException
  • के साथ विफल रहता है Harmony प्रोजेक्ट से एंड्रॉइड में डिफ़ॉल्ट 'ExpatParser' XMLSchema सत्यापन का समर्थन नहीं करता है।
  • एंड्रॉइड ऐप में ज़र्सेज़ लोड करना संभव है, और इसके साथ भी पार्स करना है, लेकिन पार्स मान्य करना - जब आप 'फाटल' एंड्रॉइड अपवादों को एप्लिकेशन क्रैश के कारण प्राप्त करने का प्रयास करते हैं।

मैं इस पर कुछ समय के लिए अब काम कर रहा है, और मैं एक साथ डाल दिया है 'शोध' निम्नलिखित:

अगर कोई किसी भी अधिक है एंड्रॉइड पर XMLSchema प्रमाणीकरण के बारे में जानकारी मैं किसी भी इनपुट की सराहना करता हूं।

अगर किसी ने XML पर XMLSchema सत्यापन सफलतापूर्वक किया है और मुझे जेडीओएम के लिए काम करने की कार्यक्षमता प्राप्त करने में मदद मिल सकती है तो उन्हें हजारों इंटरनेट पॉइंट मिलेगा ... ;-) और जेडीओएम कोड में अमर हो जाएगा और संदेश भेजे जाएंगे।

+0

इसे देखने का प्रयास करें http://stackoverflow.com/questions/9998134/validate-xml-against-schema-on-android-using-xerces – LeoMobDev

उत्तर

-1

मुझे लगता है कि आप RelaxNG का उपयोग कर सकते हैं - बहुत सारे वैधकर्ता उपलब्ध हैं। http://www.kohsuke.org/relaxng/bali/doc/ - - https://msv.java.net/ - http://relaxng.org/#validators

विशेष रुचि के

होना चाहिए http://www.davidashen.net/rnv.html

बाद सी कार्यान्वयन, पहले दो जावा में लिखा जाता है।

यदि आपको उच्च प्रदर्शन की आवश्यकता है, तो आप कुछ जेएनआई कोड लिख सकते हैं और आरएनवी स्रोत में फ़ंक्शन कॉल कर सकते हैं। एनडीके का उपयोग करके एंड्रॉइड के लिए केवल आरएनवी बनाने के लिए एक आसान तरीका होगा और फिर इसे पैरामीटर के साथ निष्पादन योग्य कहें।

कुछ

तरह
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

एक नज़र डालने के लिए धन्यवाद। मैंने स्पष्ट रूप से XMLSchema सत्यापन के लिए पूछा। RelaxNG का सुझाव मुझे XMLSchemas के खिलाफ मान्य करने में मदद नहीं करेगा। – rolfl

+0

खराब दिन? नहीं, एक बुरा दिन नहीं। पूछने के लिए धन्यवाद। मुझे लगता है कि आप मेरे प्रश्न में पहली वाक्य के प्रभाव को याद कर रहे हैं। जेडीओएम एक जावा-केवल पुस्तकालय है, और गैर-जावा निर्भरताओं को पेश नहीं कर सकता है। जेएनआई या बाहरी-से-जावा समाधान का सुझाव देना सहायक नहीं है। – rolfl

+0

xmllint के बारे में क्या? http://xmlsoft.org/xmllint.html – fabian

0

मैं

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

उपयोग कर रहा हूँ आप मिल गया तो एक एक्सएमएल स्ट्रिंग आप से यह पार्स कर सकते हैं:

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

अपवाद हैंडलिंग मत भूलना कृपया ।

+1

ओप स्पष्ट रूप से एक स्कीमा के खिलाफ सत्यापन के लिए पूछ रहा है, न केवल केवल पार्सिंग! – juwi

2

मुझे आश्चर्य है कि, कई सालों बाद, यह अभी भी एक खुला मुद्दा है। हालांकि, केवल बुरी खबरें प्रतीत होती हैं। AOSP Issue Tracker स्कीमा मान्यता के अनुसार वर्तमान में मानक Android API के साथ असमर्थित लगता है और गूगल इसे ठीक करने के लिए तैयार नहीं हो रहा है:

(SAX, XmlPull और डोम सहित) निम्नलिखित में से किसी का समर्थन नहीं करते हमारे एक्सएमएल एपीआई :

XML Schema 

XML DTDs (including external entity declarations and references) 
validation 

element content whitespace 

हालांकि, कि एक ही टिकट से एक टिप्पणीकार का संदर्भ एक workaround, और एक Xerces पोर्ट का उपयोग कर उदाहरण कोड प्रदान करता है। मुझे नहीं पता कि यह आपके द्वारा निकाले गए कार्यों से परे है, लेकिन मुझे आशा है कि इससे मदद मिलती है।

इस लपेट के लिए: SchemaFactoryFinder केवल निम्न स्कीमा परिभाषा के जानता है:

किसी अन्य स्कीमा परिभाषा कारणों का उपयोग करना यह विफल होने के लिए (हालांकि यह डीबग स्तर पर लॉग इन करेगा)। स्पष्ट रूप से यह आपके लिए मामला है, क्योंकि आप 2011 स्कीमा के लिए एक और संदर्भ का उपयोग कर रहे हैं। तो स्कीमा परिभाषा को संदर्भित करने के लिए "सही ढंग से" इस मुद्दे को ठीक करना चाहिए।

+1

दिलचस्प अपडेट, मैं आपके पास जो कुछ भी है उसे पचाने की कोशिश कर रहा हूं .... ऐसा लगता है कि यह एक क्रिप्टो लाइब्रेरी का एक लिंक है जो आंतरिक रूप से एक पूर्ण Xerces पार्सर को निर्भरता के रूप में पुनर्निर्माण करता है। यह एक परिस्थिति है, क्योंकि इसे किसी मौजूदा प्रोजेक्ट का सबसेट खींचने की आवश्यकता है, और मुझे पूर्ण पार्सर को बनाए रखने की आवश्यकता होगी। यह एक दिलचस्प सीसा है, लेकिन समाधान नहीं, कम से कम जहां तक ​​मैं कह सकता हूं। – rolfl

+0

हाँ, मैंने सोचा। हमारे कोड बेस के साथ भी दो बार चेक किया गया। हम यहां कुछ और एक्सएमएल पार्सिंग करते हैं, लेकिन कहीं भी सत्यापन नहीं होता है। मैं अभी तक अपने सिर को इसके चारों ओर लपेट नहीं सकता हूं। लिबकोर में वास्तविक कार्यान्वयन की जांच करने के लिए जा रहे हैं और देखें कि – juwi

+0

वास्तव में ... मुझे लगता है कि मुझे समस्या मिली है: https://android.googlesource.com/platform/libcore/+/master/luni/src /main/java/javax/xml/validation/SchemaFactoryFinder.java लाइन 237ff। – juwi

संबंधित मुद्दे