Самый безболезненный способ добавить XPath 3.0 в кодовую базу с помощью dom4j

Насколько я понимаю, SAXON — единственная библиотека, которая поддерживает XPath 3.0 в Java. Его реализация JAXP поддерживает только XPath 2.0. Его реализация XPath 3.0 должна называться таким образом и требует, чтобы я создал документ в первую очередь с его собственным API, а не с использованием JAXP-совместимого API, такого как DOM4J.

Это боль, потому что я старался абстрагировать все, что использует XPath, на прокси-интерфейс, принимая узел JAXP и строку xpath в качестве параметров, но это кажется бессмысленным, если мне нужно реорганизовать все, чтобы использовать узлы SAXON сверху вниз.

Я что-то неправильно понимаю? Есть ли менее болезненный способ?


person user291699    schedule 10.02.2016    source источник
comment
Существуют различные реализации XQuery 3.0 в Java, а XPath 3.0 является подмножеством XQuery 3.0. Что касается JAXP, я не знаю, предоставляет ли BaseX или eXist этот API. Что касается Saxon, почему вы думаете, что XPath 2.0 возможен с Saxon и JAXP, а XPath 3.0 — нет? Я думаю, что обе версии могут привести к результатам, которые JAXP не может обработать, но в целом я не вижу ограничений для XPath 2.0. JAXP в значительной степени ориентирован на XPath 1.0, это все, что затрудняет использование последовательностей атомарных значений богатой системы типов и узлов с API, который хочет вернуть набор узлов или одно примитивное значение.   -  person Martin Honnen    schedule 10.02.2016
comment
Я пробовал Saxon 9.7 HE и JAXP XPath с некоторыми примерами выражений, использующих функции XPath 3.0 и 3.1, такие как ! или let или json-to-xml, и они работают нормально. Некоторые функции, такие как функции высшего порядка или встроенные функции, не поддерживаются в HE, но работают в EE.   -  person Martin Honnen    schedule 11.02.2016


Ответы (1)


Я все чаще пытаюсь убедить пользователей использовать s9api API вместо JAXP для обработки XPath. На это есть множество причин: интерфейс JAXP очень нерешительно поддерживает древовидные модели, отличные от DOM; он действительно борется с расширенной системой типов XPath 2.0, а теперь и 3.0, а в случае с Saxon он вообще плохо взаимодействует с другими XML-технологиями и API.

Однако Saxon продолжает поддерживать JAXP XPath API со всеми его ограничениями как в отношении собственной модели дерева, так и в отношении сторонних моделей дерева, таких как DOM4J.

Одна вещь, от которой мы отказались, — это поддержка интерфейса служб XPath, благодаря чему приложение, использующее метод XPathFactory.newInstance(), подберет Saxon, если он находится в пути к классам. Причина этого в том, что вам действительно нужно знать, когда вы пишете приложение, хотите ли вы процессор XPath 1.0 или 2.0, а механизм JAXP не дает вам возможности сказать, какой вы хотите, или обнаружить, какой вам дали. В результате многие приложения испытывали труднодиагностируемые сбои при развертывании с неверным путем к классам. Если вы хотите, чтобы Saxon был вашим провайдером JAXP XPath, теперь вам нужно запросить его явно.

Было бы полезно, если бы вы могли более конкретно указать, что вы пытаетесь сделать, и как это терпит неудачу.

person Michael Kay    schedule 10.02.2016