独自のクラスを作成せずにNamespaceContextインスタンスインスタンスを取得することは可能です。その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));
前述のプレフィックスは完全に曖昧な表現につながる可能性がある - あなたが名前空間接頭辞をドロップしたい場合は、ドキュメントの書式を変更する必要があると思います。ドキュメントからコンテキストを作成することは必ずしも意味をなさない。プレフィックスは、このコードのように、任意の文書中のもの、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によって返された実装でも上記1のいずれもがフルclass/methodを実装します文書に定義されている契約。完全な地図ベースの実装hereを得ることができます。
あなたの質問から、いくつかの基本的な誤解があります:XPathでXMLからすべての名前空間URIを得ることができますが(SOの答えがあります)、接頭辞 - 名前空間URIバインディングクラスを単純に設定することはできません。 *各ノードに対して**異なる境界になる可能性があります。ノードを選択するときは、事前に必要な要素の名前を知っている必要があります** **名前空間URI ** –