Java XPath: Запросы с пространством имен xmlns по умолчанию

Я хочу выполнить XPath-запрос к этому файлу (показана выдержка):

<?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"/>

Это фрагмент кода, который я использую:

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);

Проблема, с которой я сталкиваюсь, заключается в том, что когда на пространство имен по умолчанию ссылаются в запросе XPath, метод getNamespaceURI не вызывается для его разрешения. Этот запрос, например, ничего не извлекает:

//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type=\"Model\"]/@package

Теперь я попробовал "обмануть" синтаксический анализатор, заменив xmlnsподдельным префиксом d, а затем соответствующим образом написав метод getNamespaceURI(чтобы вернуть http://xml.sap. com/2002/10/metamodel/webdynpro, когда встречается d). В этом случае вызывается getNamespaceURI, но результатом вычисления выражения XPath всегда является пустая строка.

Если я уберу пространства имен из файла и из выражения запроса XPath, я смогу получить нужную строку (com.test.mypackage).

Есть ли способ заставить все работать правильно с пространством имен по умолчанию?

7
задан pnuts 16 November 2015 в 21:59
поделиться