JAXB / MOXy: Как установить, какой xpath подразумевается использовать?
Я использую МОКСИ @XmlPath("/foo/bar[@baz]")
,
В другом месте приложения мне нужен XSLT 2.0, поэтому я включил Saxon HA 9.5 в мой путь к классам. Но это вызвало сбой XPath (не находит узлы, в отличие от реализации JDK).
Как я могу установить для MOXy, какой XML / XPath предполагается использовать?
В настоящее время я использую jaxb.properties
рядом с бобами JAXB .class
, но я в порядке, чтобы создать маршаллер с некоторыми заводскими настройками или чем-то подобным.
Дополнительный вопрос: я думаю, что проблема с XPath заключается в том, что файл XML использует пространства имен, <deployment xmlns="urn:jboss:bean-deployer:2.0"> ...
Как я могу заставить саксонцев игнорировать пространства имен в XPath? (без переписывания выражения XPath).
2 ответа
EclipseLink JAXB (MOXy)@XmlPath
аннотация поддерживает подмножество спецификации XPath. Обработка XPath выполняется самой MOXy. Поддерживаются следующие концепции:
- Атрибут -
@id
- Элемент -
address
- Элемент по позиции -
address[1]
- Элемент по предикату -
address[@type='mailing']
- Элемент Текст -
name/text()
- Текст -
text()
- Self -
.
- Сочетание -
personal-info/name[2]/text()
Для узлов, квалифицированных в пространстве имен, префиксы, определенные в @XmlNs
аннотации могут использоваться для определения фрагментов XPath. Предполагается, что неквалифицированные фрагменты находятся в пространстве имен, указанном с помощью @XmlSchema
,
Для справки, это не было связано с МОКСИ. Это был мой код с использованием XPath. Итак, я закончил с
//XPathFactory xpf = XPath xp = XPathFactory.newInstance();
//XPathFactory xpf = new net.sf.saxon.xpath.XPathFactoryImpl();
XPathFactory xpf = new com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl();
Это будет жаловаться
com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl is internal proprietary API and may be removed in a future release
но работает.
Что касается пространств имен, вот обсуждение игнорирования пространств имен.