2012-08-07 9 views
6

के आधार पर विफलता मैं एक्सएमएल सत्यापन करने की कोशिश कर रहा हूं। मुझे रन-टाइम (संभवतः एक जार में लपेटा गया) पर स्कीमा की एक सूची दी जा रही है। प्रमाणीकरण उस आदेश के आधार पर गुजरता है या विफल रहता है जिसमें मैं स्कीमा फैक्ट्री को स्कीमा प्रदान करता हूं।रनटाइम पर लोडिंग स्कीमा के साथ एक्सएमएल मान्य करें, स्कीमा ऑर्डर

private void validateXml(String xml, List<URI> schemas){ 
     Source[] source = new StreamSource[schemas.size()]; 
     int i=0; 
     for (URI f : schemas){ 
      source[i++] = new StreamSource(f.openStream()); 
     } 

     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NA_URI); 
     sf.setResourceResolver(new MyClassPathResourceResolver()); 

     Schema schema = schemaFactory.newSchema(source); 
     Validator validator = schema.newValidator(); 
     validator.validate(new StreamSource(new ByteArrayInputStream(xml.getBytes())); 

फिर से, इस विफल रहता है स्कीमा के पारित कर दिया सेट स्कीमा के साथ शुरू करने के लिए नहीं है जो एक्सएमएल referrs के मूल तत्व:

यहाँ मैं क्या कर रहा हूँ है। क्या इसमें कोई फिक्स है या क्या मैं कुछ गलत कर रहा हूं?

+0

क्या आप कहीं भी स्कीमा और एक्सएमएल पोस्ट कर सकते हैं? – davidfmatheson

+0

@ डेविडफैमथेसन दुर्भाग्यवश यह संभव नहीं है, मैं कह सकता हूं कि यह स्कीमा का एक सेट है, रूट स्कीमा और दूसरी स्कीमा जो एक अलग टैग के साथ पहली स्कीमा के शरीर के प्रतिस्थापन की अनुमति देती है। –

उत्तर

5

डिफ़ॉल्ट रूप से Xerces एक स्कीमा दस्तावेज़ को अनदेखा कर देगा यदि उसके पास पहले से ही उसी नामस्थान के लिए स्कीमा दस्तावेज़ है। यह व्यवहार

http://apache.org/xml/features/validation/schema/handle-multiple-imports

+0

मुझे इस लिंक में HTTP 404 मिल रहा है, क्या आप कुछ अतिरिक्त विवरण दे सकते हैं? –

+0

इसके अलावा, मुझे 2 स्कीमा लोड करने की आवश्यकता है (जिनमें से प्रत्येक आयात अतिरिक्त योजनाएं)। अगर मैं इन्हें सही क्रम में लोड करता हूं, तो सब कुछ ठीक है। अन्यथा, कोई खुशी नहीं। दो स्कीमा के पास अलग-अलग लक्ष्य नम्पेस हैं। –

+0

इसे यूआरएल के रूप में इस्तेमाल करने के बजाय इसके लिए खोज करने का प्रयास करें। यह एक जेएक्सपी विकल्प नाम यूआरएल नहीं है। (ठीक है, कुछ ब्राउज़र पता बार और खोज बार को जोड़कर इसे मुश्किल बनाते हैं। Google.com पर जाकर यह पुराना तरीका है)। –

0

सबसे पहले कारखाने विकल्प का उपयोग बदला जा सकता है, तो आप registerErrorHandler() विधि को फोन करके एक्सएमएल पाठक पर org.xml.sax.ErrorHandler वस्तु का एक उदाहरण सेट करना होगा। आपको चेतावनियां मिल सकती हैं जो आपको मुद्दे के बारे में बताएंगी।

दूसरा, आपको पता होना चाहिए कि आप किस एक्सएमएल लाइब्रेरी का उपयोग कर रहे हैं। अपने कोड में schemaFactory.getClass()। GetName() पर कॉल करें और इसे प्रिंट करें। एक बार जब आप लाइब्रेरी को जानते हैं, तो आप कई दस्तावेज आयात चालू/बंद करने के लिए सुविधा का समर्थन करते हैं, तो आप इसके प्रलेखन का उल्लेख कर सकते हैं।

+0

कक्षा 'com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory' है –

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