che voglio fare una query XPath su questo file (estratto mostrati):Java XPath: Query con xmlns namespace di default
<?xml version="1.0" encoding="UTF-8"?>
<!-- MetaDataAPI generated on: Friday, May 25, 2007 3:26:31 PM CEST -->
<ModelClass xmlns="http://xml.sap.com/2002/10/metamodel/webdynpro" xmlns:IDX="urn:sap.com:WebDynpro.ModelClass:2.0">
<ModelClass.Parent>
<Core.Reference package="com.test.mypackage" name="ModelName" type="Model"/>
Si tratta di un frammento di codice che sto utilizzando:
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document document = builder.parse(new File(testFile));
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new NamespaceContext() {
public String getNamespaceURI(String prefix) {
...
String result = xpath.evaluate(xpathQueryString, document);
System.out.println(result);
Il problema che sto affrontando è che quando lo spazio dei nomi predefinito viene fatto riferimento in una query XPath, il metodo getNamespaceURI non viene chiamato per risolverlo. Questa query ad esempio, non consente di estrarre nulla:
//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type=\"Model\"]/@package
Ora ho provato a "ingannare" il parser sostituendo xmlns
con un prefisso falso d
e poi a scrivere il metodo getNamespaceURI
di conseguenza (si fa per tornare http://xml.sap.com/2002/10/metamodel/webdynpro
quando viene rilevato d
). In questo caso, viene chiamato getNamespaceURI
ma il risultato della valutazione dell'espressione XPath è sempre una stringa vuota.
Se spoglio gli spazi dei nomi dal file e dall'espressione di query XPath, posso ottenere la stringa desiderata (com.test.mypackage).
C'è un modo per far funzionare le cose correttamente con lo spazio dei nomi predefinito?
Ciao Martin, l'ho provato ma non funziona ... –
Assicurati di creare anche un DocumentBuilder con lo spazio dei nomi http://docs.oracle.com/javase/6/docs/api/javax/ xml/parsers/DocumentBuilderFactory.html # setNamespaceAware% 28boolean% 29 prima di lavorare con namespace. –
Questo ha fatto il trucco. Pensavo che DocumentBuilder fosse per impostazione predefinita al corrente degli spazi dei nomi. Grazie ancora. –