EclipseLink MOXy @XmlPath возвращает неверные данные для содержимого

Я пытаюсь демаршалировать поток данных XML с помощью EclipseLink MOXy с XPath, используя функцию contains.

Когда я применяю образец XPath непосредственно к образцу потока данных XML, я получаю правильное возвращаемое значение (Ref_number_1). Однако, когда я распаковываю это с помощью MOXy, для refNumber1 устанавливается значение «Ref_number_2».

MOXy не поддерживает этот тип XPath? Казалось бы, он, по крайней мере, понимает это, потому что он не выдает ошибку, а просто устанавливает неправильное значение.

У кого-нибудь есть опыт с подобными вещами? Знаете лучший подход?

Спасибо за любую помощь.

Код маршала:

String s = //xml stream from restful service (see xml example below);
StringReader sr = new StringReader(s);
ReferenceNumber refNum = (ReferenceNumber)marshaller.unmarshal(
            new StreamSource(sr));

Аннотация участника:

@XmlPath("Header/ReferenceNumbers/ReferenceNumber[contains(ReferenceNumberType, \"REF_NUMBER_TYPE_1\")]/ReferenceNumber/text()")
private String refNumber1;

XML-данные:

<?xml version="1.0" encoding="UTF-8"?>
<Document>
  <Header>      
    <ReferenceNumbers>
      <ReferenceNumber>
        <ReferenceNumber>Ref_number_1</ReferenceNumber>
        <ReferenceNumberType>REF_NUMBER_TYPE_1</ReferenceNumberType>
      </ReferenceNumber>
      <ReferenceNumber>
        <ReferenceNumber>Ref_number_2</ReferenceNumber>
        <ReferenceNumberType>REF_NUMBER_TYPE_2</ReferenceNumberType>
      </ReferenceNumber>
    </ReferenceNumbers>
  </Header>
</Document>

person user1812806    schedule 21.12.2012    source источник


Ответы (1)


Примечание. Я EclipseLink JAXB (MOXy) руководитель и член JAXB (JSR-222) группа экспертов.

В настоящее время MOXy не поддерживает XPath такой формы. В настоящее время условная проверка должна выполняться для атрибута, содержащегося в элементе, например (см.: http://blog.bdoughan.com/2011/03/map-to-element-based-on-attribute-value.html).

@XmlPath("personal-info/name[@type='first']/text()")
String firstName;

Я ввел следующую ошибку, чтобы улучшить проверку нашей аннотации @XmlPath:

Меня также интересует вариант использования, описанный в вашем вопросе. Не могли бы вы ввести дополнительные требования к компоненту MOXy для этого:

person bdoughan    schedule 21.12.2012
comment
Спасибо за быстрый ответ. Я так и предполагал. Как видно из структуры xml, она не идеальна. Помимо очевидной вложенной избыточности, которая сама по себе является проблемой, элемент ReferenceNumberType было бы намного лучше разместить в качестве атрибута типа в родительском элементе ReferenceNumber, который затем можно было бы анализировать. У меня нет прямого контроля над выводом xml, но я запросил это изменение. - person user1812806; 22.12.2012