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

Popular posts from this blog

Verilog Error: output or inout port "Q" must be connected to a structural net expression -

jasper reports - How to center align barcode using jasperreports and barcode4j -

c# - ASP.NET MVC - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value -