नेमस्पेस कॉन्टेक्स्ट उदाहरण प्राप्त करना संभव है अपनी कक्षा के बिना। इसका class-use पृष्ठ दिखाता है कि आप javax.xml.stream पैकेज का उपयोग करके एक प्राप्त कर सकते हैं।
String ctxtTemplate = "<data xmlns=\"http://base\" xmlns:foo=\"http://foo\" />";
NamespaceContext nsContext = null;
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader evtReader = factory
.createXMLEventReader(new StringReader(ctxtTemplate));
while (evtReader.hasNext()) {
XMLEvent event = evtReader.nextEvent();
if (event.isStartElement()) {
nsContext = ((StartElement) event)
.getNamespaceContext();
break;
}
}
System.out.println(nsContext.getNamespaceURI(""));
System.out.println(nsContext.getNamespaceURI("foo"));
System.out.println(nsContext
.getNamespaceURI(XMLConstants.XMLNS_ATTRIBUTE));
System.out.println(nsContext
.getNamespaceURI(XMLConstants.XML_NS_PREFIX));
forgoing उपसर्गों पूरी तरह अस्पष्ट भाव होने की संभावना है - अगर आप नामस्थान उपसर्ग ड्रॉप करना चाहते हैं, आप दस्तावेज़ प्रारूप को बदलने की जरूरत होगी। किसी दस्तावेज़ से संदर्भ बनाना आवश्यक नहीं है। उपसर्गों इस कोड के रूप में, XPath अभिव्यक्ति में प्रयोग किया जाता हैं, किसी भी दस्तावेज़ में नहीं लोगों से मेल करने के लिए है:
String xml = "<data xmlns=\"http://base\" xmlns:foo=\"http://foo\" >"
+ "<foo:value>"
+ "hello"
+ "</foo:value>"
+ "</data>";
String expression = "/stack:data/overflow:value";
class BaseFooContext implements NamespaceContext {
@Override
public String getNamespaceURI(String prefix) {
if ("stack".equals(prefix))
return "http://base";
if ("overflow".equals(prefix))
return "http://foo";
throw new IllegalArgumentException(prefix);
}
@Override
public String getPrefix(String namespaceURI) {
throw new UnsupportedOperationException();
}
@Override
public Iterator<String> getPrefixes(
String namespaceURI) {
throw new UnsupportedOperationException();
}
}
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new BaseFooContext());
String value = xpath.evaluate(expression,
new InputSource(new StringReader(xml)));
System.out.println(value);
न तो कार्यान्वयन StAX एपीआई और न ही ऊपर एक करके लौटे पूर्ण class/method लागू दस्तावेज़ में परिभाषित अनुबंध। आप एक पूर्ण, मानचित्र-आधारित कार्यान्वयन here प्राप्त कर सकते हैं।
आपके प्रश्न से कुछ बुनियादी मिसंडरोड है: आप एक्सपीआई के साथ एक्सएमआई से सभी नामस्थान यूआरआई प्राप्त कर सकते हैं (एसओ में इसके लिए उत्तर हैं), लेकिन आप एक उपसर्ग-नामस्थान यूआरआई बाइंडिंग क्लास को सरल नहीं बना सकते हैं क्योंकि * * प्रत्येक नोड के लिए ** यह एक अलग बाध्य हो सकता है। नोड्स का चयन करते समय आपको अपने वांछित तत्वों के नामों को पहले से जानना चाहिए ** और इसमें उनके नेमस्पेस यूआरआई ** –