java - javax.xml, XPath is not extracted from XML with namespaces -
वहाँ "मूल" XML है
& lt; साबुन: लिफाफा xmlns: साबुन = " http://www.w3.org/2003/05/soap-envelope"> & LT; साबुन: हैडर & gt; & Lt; संदर्भ xmlns = "कलश: ज़िम्बाब" & gt; & Lt; सत्र आईडी = "555" & gt; 555 & lt; / सत्र & gt; & lt; परिवर्तन टोकन = "333" / & gt; & Lt; / संदर्भ & gt; & Lt; / साबुन: हैडर & gt; & LT; साबुन: शरीर & gt; & lt; AuthResponse xmlns = "कलश: ज़िम्बारएकाउंट" & gt; & LT; जीवनकाल & gt; 172799999 & lt; / जीवन & gt; & Lt; सत्र आईडी = "555" & gt; 555 & lt; / सत्र & gt; & LT; त्वचा & gt; कार्बन & lt; / त्वचा & gt; & Lt; / AuthResponse & gt; & Lt; / साबुन: शरीर & gt; & Lt; / साबुन: लिफाफा & gt; XML इस तरह से पार्स किया जाता है
// javax.xml.parsers। * DocumentBuilderFactory कारखाना = DocumentBuilderFactory.newInstance (); DocumentBuilder बिल्डर = कारखाना.न्यूड दस्तावेज़ब्लूल्डर (); दस्तावेज़ डॉक = बिल्डर। पार्स (पथटॉक्सीमल); तब मैं XPath द्वारा सत्र आईडी निकालने की कोशिश कर रहा हूं
// javax.xml.xpath। *; XPathFactory xPathfactory = XPathFactory.newInstance (); XPath xpath = xPathfactory.newXPath (); // अगला एक्सपेथ जावा और ऑनलाइन एक्सपेथ टेस्टर के साथ काम नहीं करता है / XPathExpression expr = xpath.compile ("/ साबुन: लिफाफा / साबुन: हैडर / संदर्भ / सत्र / पाठ ()"); // यह एक्सपेथ ऑनलाइन एक्सपेथ परीक्षक के साथ कार्य करता है, लेकिन जावा XPathExpression expr = xpath.compile ("/ साबुन: लिफाफा / साबुन: हैडर / * [नाम () = 'संदर्भ'] / * [name () = ' सत्र '] / पाठ () "); स्ट्रिंग सत्रआईडी = (स्ट्रिंग) expr.evaluate (डॉक्टर, XPathConstants.STRING); यहां जांच की
जब एक्सएमएल इस पर सरलीकृत होता है
& lt; लिफाफा xmlns: साबुन = "http: // www .w3.org / 2003/05 / साबुन लिफाफा "& gt; & LT; हैडर & gt; & LT; संदर्भ & gt; & lt; सत्र आईडी = "555" & gt; 555 & lt; / सत्र & gt; & lt; परिवर्तन टोकन = "333" / & gt; & Lt; / संदर्भ & gt; & Lt; / हैडर & gt; & LT; body & gt; & lt; AuthResponse xmlns = "कलश: ज़िम्बारएकाउंट" & gt; & LT; जीवनकाल & gt; 172799999 & lt; / जीवन & gt; & lt; सत्र आईडी = "555" & gt; 555 & lt; / सत्र & gt; & LT; त्वचा & gt; कार्बन & lt; / त्वचा & gt; & Lt; / AuthResponse & gt; & Lt; / body & gt; & Lt; / लिफाफा & gt; यह XPath अपना काम करता है
XPathExpression expr = xpath.compile ("/ लिफाफा / हैडर / संदर्भ / सत्र / पाठ ()"); जावा के साथ "मूल" XML से सत्र आईडी निकालने के लिए कैसे करें?
अद्यतन: जेडीके 1.6
जवाब यह है कि आपको इसकी जरुरत है:
सबसे पहले, अपना DocumentBuilderFactory नामस्थान बनाओ इससे पहले कि आप इसे इस्तेमाल कर सकें : <पूर्व> factory.setNamespaceAware (सच); फिर ऐसा मान प्राप्त करें, जिसे आप चाहते हैं:
XPathFactory xPathfactory = XPathFactory.newInstance (); XPath xpath = xPathfactory.newXPath (); Xpath.setNamespaceContext (नया नेमस्पेसटेन्टेक्स्ट) {@Override सार्वजनिक स्ट्रिंग प्राप्तनामपेजयूआरआई (स्ट्रिंग उपसर्ग) {if (prefix.equals ("साबुन")) {वापसी "http://www.w3.org/2003/05/soap-envelope ";} यदि (prefix.equals (" zmb ")) {वापसी" कलश: ज़िम्बार ";} वापसी XMLConstants.NULL_NS_URI;} @ ओवरराइड सार्वजनिक स्ट्रिंग getPrefix (स्ट्रिंग नेमस्पेसयूआरआई) {नया असमर्थितऑपरेशन अपवाद फेंक (" अभी तक समर्थित नहीं है। ") ;} @ ओवरराइड पब्लिक इटरेटर मिलप्राफिक्स (स्ट्रिंग नेमस्पेसयूआरआई) {नया असमर्थितऑपरेशन एक्सपैशन ("अभी तक समर्थित नहीं है।");}}); XPathExpression expr = xpath.compile ("/ साबुन: लिफाफा / साबुन: हैडर / जेएमबी: संदर्भ / जेएमबी: सत्र"); स्ट्रिंग सत्रआईडी = (स्ट्रिंग) expr.evaluate (डॉक्टर, XPathConstants.STRING); नामपेस कंसटेक्स वर्ग को आयात करने के लिए आपको अपनी फ़ाइल की शुरुआत में एक पंक्ति जोड़नी पड़ सकती है:
आयात javax.xml.namespace.NamespaceContext;
Comments
Post a Comment