Java XPath: kwerendy z domyślną przestrzenią nazw xmlns
Chcę wykonać zapytanie XPath w tym pliku (pokazano fragment):
<?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"/>
To fragment kodu, którego używam:
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);
Problem, z którym się borykam, polega na tym, że w przypadku odwołania do domyślnej przestrzeni nazw w kwerendzie XPath metoda getNamespaceURI nie jest wywoływana w celu jej rozwiązania. To zapytanie na przykład nic nie wyciąga:
//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type=\"Model\"]/@package
Teraz próbowałem „wyłudzić” parser, zastępując goxmlns
z fałszywym prefiksemd
a następnie pisaniegetNamespaceURI
metoda (odpowiednio, aby powrócićhttp://xml.sap.com/2002/10/metamodel/webdynpro
gdyd
napotkany). W tym przypadkugetNamespaceURI
jest wywoływane, ale wynikiem oceny wyrażenia XPath jest zawsze pusty łańcuch.
Jeśli usuwam przestrzenie nazw z pliku i wyrażenia zapytania XPath, mogę uzyskać żądany ciąg (com.test.mypackage).
Czy istnieje sposób na poprawne działanie z domyślną przestrzenią nazw?