Цель getNamespaceURI
внутри NamespaceContext
- связать каждое пространство имен в исходном документе с уникальным префиксом, чтобы механизм XPath знал, к какому пространству имен относится элемент, всякий раз, когда он встречает эту строку префикса в XPath выражение. Префикс здесь не должен совпадать с префиксом (если есть) для того же URI в исходном XML; ему просто нужно отобразить префикс в правильное пространство имен.
Итак, если бы вы написали следующее выражение:
//p:QDTM_IN300301QD/p:controlActEvent/p:subject/p:registrationEvent/p:subject
/p:testCodeIdentifier/p:playingTestCodeDetails/p:code
/p:translation[@codeSystemName='DOSCATALOGNAMEHTMLENABLED']
/p:originalText/text()"
... тогда вы бы написали соответствующий getNamespaceURI
так:
public String getNamespaceURI(String prefix) {
if ("p".equals(prefix)) {
return "urn:hl7-org:v3";
}
return null;
}
Так движок знает, что нужно искать элемент в пространстве имен urn:hl7-org:v3
всякий раз, когда он сталкивается с префиксом p
, что и составляет весь смысл. В противном случае, как движок узнает, что вам не нужен элемент с именем QDTM_IN300301QD
в no пространстве имен? Или элемент с таким именем в каком-то другом пространстве имен?
Обратите внимание, что имя префикса произвольно; это может быть все, что вы хотите, пока это уникально. То есть, если в вашем документе есть другие пространства имен, вам нужно изменить getNamespaceURI
, чтобы знать эти пространства имен и назначить уникальный префикс для каждого из них.
Вот полный (минимальный) пример:
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("Draft.xml");
XPath xpath = XPathFactory.newInstance().newXPath();
NamespaceContext ctx = new NamespaceContext() {
public String getNamespaceURI(String prefix) {
if ("p".equals(prefix)) {
return "urn:hl7-org:v3";
}
return null;
}
public String getPrefix(String uri) {
throw new UnsupportedOperationException();
}
public Iterator getPrefixes(String uri) {
throw new UnsupportedOperationException();
}
};
xpath.setNamespaceContext(ctx);
XPathExpression expr = xpath.compile("//p:QDTM_IN300301QD/p:controlActEvent" +
"/p:subject/p:registrationEvent" +
"/p:subject/p:testCodeIdentifier/p:playingTestCodeDetails/p:code" +
"/p:translation[@codeSystemName='DOSCATALOGNAMEHTMLENABLED']" +
"/p:originalText/text()");
System.out.println("[" + expr.evaluate(doc, XPathConstants.STRING));