2011-08-10 12 views
7

का उपयोग करके मेरे पास xml मान्य करने के लिए दो xsd फ़ाइलें हैं। लेकिन समस्या यह है कि मेरा कोड केवल एक एक्सएसडी लेता है। निम्नलिखित कोड में अन्य xsd का उपयोग कैसे करें? मुझे इस बारे में कोई जानकारी नहीं है कि मुझे दूसरी xsd फ़ाइल कहां रखनी चाहिए/कॉल करना चाहिए।एक्सएमएल प्रमाणीकरण - एकाधिक xsd के

   private void validate(File xmlF,File xsd1,File xsd2) { 
        try { 
         url = new URL(xsd.toURI().toString());// xsd1 
        } catch (MalformedURLException e) { 
         e.printStackTrace(); 
        } 


        source = new StreamSource(xml); // xml 
        try { 
         System.out.println(url); 
         schema = schemaFactory.newSchema(url); 
        } catch (SAXException e) { 
         e.printStackTrace(); 
        } 
        validator = schema.newValidator(); 
        System.out.println(xml); 
        try { 
         validator.validate(source); 
        } catch (SAXException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
+4

क्या आपने पहले से ही ['नयाशेमा (स्रोत [])'] (http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/validation/SchemaFactory.html#newSchema (javax.xml) का प्रयास किया था .transform.Source []))? –

+0

हां। मैंने उस तरह से कोशिश की। यह काम नहीं कर रहा है, शायद क्योंकि स्रोत [] एक्सएमएल के लिए प्रयोग किया जाता है। हम स्रोत के लिए xsd टाइपकास्ट नहीं कर सकते हैं। – freepublicview

+2

इस XML सत्यापन प्रोजेक्ट के संबंध में पिछले प्रश्न के साथ, मैं आपको [SSCCE] (http://sscce.org/) पर इंगित करना चाहता हूं। आपका कोड स्निपेट बहुत दूर है क्योंकि आप इस विधि के बाहर चर को परिभाषित करते हैं। जिस तरह से आप अपना प्रश्न पूछते हैं, उस पर ध्यान देना, आपकी मदद करने में हमारी सहायता करता है। – Wivani

उत्तर

20

एसओ या Google पर खोज करते समय हिट की बहुत सारी। उनमें से एक this सवाल है, जहाँ लेखक अपने ही समाधान मिल गया और सत्यापनकर्ता करने के लिए कई XSD के जोड़ने के लिए निम्न कोड की रिपोर्ट है:

Schema schema = factory().newSchema(new Source[] { 
    new StreamSource(stream("foo.xsd")), 
    new StreamSource(stream("Alpha.xsd")), 
    new StreamSource(stream("Mercury.xsd")), 
}); 

हालांकि, जब InputStreamStreamSource पर के साथ सीधे काम कर रिसोल्वर नहीं करने में सक्षम है किसी भी संदर्भित एक्सएसडी फाइलों को लोड करें। उदाहरण के लिए, फ़ाइल xsd1 आयात या एक तृतीय फ़ाइल शामिल है (जो xsd2 नहीं है), स्कीमा निर्माण विफल हो जाएगा। आपको या तो सिस्टम पहचानकर्ता (setSystemId) सेट करना चाहिए या (यहां तक ​​कि बेहतर) StreamSource(File f) कन्स्ट्रक्टर का उपयोग करना चाहिए।

अपने उदाहरण कोड को समायोजित:

try { 
    schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    schema = schemaFactory.newSchema(new Source[] { 
    new StreamSource(xsd1), new StreamSource(xsd2) 
    }); 
} catch (SAXException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

नोट:

तो classpath संसाधनों के साथ काम कर रहा है, मैं StreamSource(String systemId) निर्माता पसंद करते हैं (बजाय एक File बनाने की तुलना में):

new StreamSource(getClass().getClassLoader().getResource("a.xsd").toExternalForm()); 
+0

बहुत अच्छा समाधान है। धन्यवाद – freepublicview

+0

यह मेरे प्रश्न के ऊपर बिल्कुल वैसा ही है। –

+3

यह वही समाधान है जिसे आपने अपनी टिप्पणी में पेश किया था। यही कारण है कि मैंने आपकी टिप्पणी को ऊपर उठाया। हालांकि ओपी को इसे लागू करने में परेशानी थी; मेरे पास अपने पिछले प्रश्न का उत्तर देने से मेरे ग्रहण में कोड तैयार था और यह स्रोत [] का उपयोग करने के तरीके को दिखाने के लिए बस समायोजित किया गया था। कोई कठोर भावना नहीं, मुझे उम्मीद है? – Wivani

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