Es posible obtener una instancia de NamespaceContext sin escribir su propia clase. Su página class-use muestra que puede obtener una utilizando el paquete 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));
prefijos anterior es del todo probable que conduzca a expresiones ambiguas - si usted quiere eliminar los prefijos de espacio de nombres, que había necesidad de cambiar el formato del documento. Crear un contexto a partir de un documento no necesariamente tiene sentido. Los prefijos tienen que coincidir con los utilizados en la expresión XPath, no los que están en cualquier documento, como en este código:
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);
Ni la aplicación devuelto por la API StAX ni la de arriba implementar la plena class/method contratos como se define en el documento. Puede obtener una implementación completa basada en mapas here.
Hay algunos errores básicos de su pregunta: puede obtener todos los URI de espacio de nombres de un XML con XPath (hay respuestas para esto en SO), pero no puede llenar una clase de enlace URI de prefijo-espacio de nombres porque * * para cada nodo ** puede ser un límite diferente. Al seleccionar nodos, debe saber de antemano los nombres de sus elementos deseados ** y eso incluye su URI de espacio de nombres ** –