2011-01-12 5 views
9

में दिए गए एक्सएमएल से ओपनएसएमएल एसेशन बनाना, मैं थोड़ी देर के लिए इसके खिलाफ अपना सिर मार रहा हूं, और प्रगति करना शुरू कर रहा हूं। हालांकि, मैं एक एसएएमएल 2 एसेशन (एक्सएमएल में) के एक स्ट्रिंग प्रस्तुति को एक एसेशन ऑब्जेक्ट में परिवर्तित करने में कुछ परेशानी में भाग गया।जावा

ऐसा लगता है कि मुझे उचित डेटा के साथ वैध org.w3c.dom.Document मिल रहा है, और मुझे लगता है कि निर्माता निर्माता से SAMLObjectBuilder<Assertion> मान्य है, लेकिन जब मैं उन्हें एक साथ रखने की कोशिश करता हूं तो मुझे एक खाली दावा मिलता है; विषय, जारीकर्ता, जारी करने का समय और इतने पर सभी null हैं, इन्हें स्पष्ट रूप से एक्सएमएल में सेट किया जा रहा है।

क्या कोई देखता है कि मैं क्या गलत कर रहा हूं, और समाधान का सुझाव दे सकता हूं?

Document doc = loadXMLFromString(saml); 

XMLObjectBuilderFactory builderFactory = Configuration.getBuilderFactory(); 

SAMLObjectBuilder<Assertion> assertionBuilder = 
    (SAMLObjectBuilder<Assertion>) 
    builderFactory.getBuilder(Assertion.DEFAULT_ELEMENT_NAME); 

Assertion assertion = assertionBuilder.buildObject(doc.getDocumentElement()); 

String nameID = assertion.getSubject().getNameID().getValue(); 

nameID काम में assertion.getSubject() रिटर्न null, अभिव्यक्ति के शेष के नाकाम रहने के।

उदाहरण मैं उपयोग कर रहा हूँ से SSTC-saml तकनीक-अवलोकन-2.0-ड्राफ्ट-03, पेज 10

ऊपर समारोह loadXMLFromString() ज्यादातर से In Java, how do I parse XML as a String instead of a file?

+0

हम यहां प्रश्न ['सोल्वड]' के साथ प्रश्न का नाम संपादित नहीं करते हैं। अगर आपको अपना जवाब मिल गया है, तो कृपया इसे बाईं ओर हरे रंग की टिक के साथ चिह्नित करें - आपका प्रश्न केवल तभी "हल" के रूप में चिह्नित किया जाएगा। – marcog

+0

@marcog मैंने पहली बार कोशिश की, लेकिन 48 घंटे की ग्रेस अवधि के अंत से पहले स्वीकार किए गए मेरे उत्तर को चिह्नित नहीं किया जा सका, और समाधान के लिए मैंने जो भी खोज की थी, सोचा कि यह चारों ओर सवाल छोड़ने के लिए पर्याप्त प्रासंगिक था इसे हटाने के बजाय। –

+1

यह बहुत अच्छा है कि आपने स्वयं जवाब पोस्ट किया है। बहुत सारे लोग बस चले जाओ। ऐसा करने के लिए दोनों प्रश्न और उत्तर के लिए +1! – marcog

उत्तर

9

मामले में उधार लिया जाता है पूर्ण एक्सएमएल है किसी और को एक ही समस्या का सामना करना पड़ रहा है, और इस पर चलता है, यहां जवाब है।

https://wiki.shibboleth.net/confluence/display/OpenSAML/OSTwoUsrManJavaCreateFromXML

बस unmarshalling उदाहरण लेते:

String inCommonMDFile = "/data/org/opensaml/saml2/metadata/InCommon-metadata.xml"; 

// Initialize the library 
DefaultBootstrap.bootstrap(); 

// Get parser pool manager 
BasicParserPool ppMgr = new BasicParserPool(); 
ppMgr.setNamespaceAware(true); 

// Parse metadata file 
InputStream in = MetadataTest.class.getResourceAsStream(inCommonMDFile); 
Document inCommonMDDoc = ppMgr.parse(in); 
Element metadataRoot = inCommonMDDoc.getDocumentElement(); 

// Get apropriate unmarshaller 
UnmarshallerFactory unmarshallerFactory = Configuration.getUnmarshallerFactory(); 
Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(metadataRoot); 

// Unmarshall using the document root element, an EntitiesDescriptor in this case 
EntitiesDescriptor inCommonMD = (EntitiesDescriptor) unmarshaller.unmarshall(metadataRoot); 

फिर inCommonMDDoc के लिए अपने दस्तावेज़ उदाहरण स्थानापन्न और अंतिम unmarshall() कॉल का परिणाम को देखो। ध्यान दें कि unmarshall() एक Object देता है जिसे आपको उचित प्रकार पर डालने की आवश्यकता होती है। संकेत: यदि आप सुनिश्चित नहीं हैं कि यह किस प्रकार का है, तो आप typeof का उपयोग कर सकते हैं, लेकिन विरासत के लिए देखें।

+0

वही सटीक समस्या है, लेकिन मैं बिंदुओं को जोड़ नहीं रहा हूं। Unmarshall का परिणाम एक संस्था डिस्क्रिप्टर है। मैं उसमें से एक नमूना वस्तु कैसे बना सकता हूं? – stu

+1

@stu: उमरशल का परिणाम आपके रूट दस्तावेज़ तत्व के समान प्रकार का एक वस्तु है। उदाहरण में यह एक संस्था डिस्क्रिप्टर है लेकिन आपके मामले में यह किसी अन्य प्रकार का SAML ऑब्जेक्ट होगा जैसे कि एसेशन। –

+0

हाँ धन्यवाद, मुझे अंत में पता चला कि, सही वस्तु और voila पर जाली। मैं बहुत डर गया था कि यह सब काम किया। – stu