无需编写自己的类就可以获取 NamespaceContext
实例。它的类使用页面显示您可以使用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));完全放弃前缀可能会导致模棱两可的表达式-
如果要删除名称空间前缀,则需要更改文档格式。从文档创建上下文不一定有意义。前缀必须匹配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
API返回的实现或以上方法均未实现文档中定义的完整类
/
方法协定。您可以在此处获得基于地图的完整实现。



