Можно ли с помощью MOXy и XPath демаршировать два списка атрибутов? - PullRequest
2 голосов
/ 18 августа 2011

Обратите внимание, это не дубликат другого вопроса, который я задал: " С помощью MOXy и XPath возможно ли демонтировать список атрибутов? " Это похоже, но не то же самое.

У меня есть XML, который выглядит следующим образом:

<test>
  <items>
    <item type="cookie" brand="oreo">cookie</item>
    <item type="crackers" brand="ritz">crackers</item>
  </items>
</test>

Это похоже на xml в моем предыдущем вопросе, за исключением того, что теперь у каждого элемента есть два атрибута вместо одного.

В моем классе:

@XmlPath("items/item/@type")
@XmlAttribute
private ArrayList<String> itemList = new ArrayList<String>();
@XmlPath("items/item/@brand")
@XmlAttribute
private ArrayList<String> brandList = new ArrayList<String>();

Благодаря ответу на мой предыдущий вопрос я могу разархивировать атрибут type в списке.brandList, однако, пусто.Если я закомментирую аннотации для itemList (поэтому он не заполняется JAXB / MOXy), тогда brandList содержит правильные значения.

Похоже, что я могу только разархивировать один атрибут в списке, используя XPath,Это по своему замыслу или я что-то неправильно настроил?

Обновление: Кажется, я не могу удалить текст и атрибут из элемента.Если мой класс отображается так:

@XmlPath("items/item/text()")
@XmlElement
private ArrayList<String> itemList = new ArrayList<String>();
@XmlPath("items/item/@brand")
@XmlAttribute
private ArrayList<String> brandList = new ArrayList<String>();

brandList также пусто в этом случае.Если я сначала переключу порядок и карту brandList, то itemList будет пустым.Как будто первое отображение использует элемент, поэтому дальнейшие значения, основанные на этом элементе или его атрибутах, не могут быть прочитаны.

1 Ответ

1 голос
/ 19 августа 2011

Короткий ответ

Это не тот случай использования, который в настоящее время поддерживается с @XmlPath в EclipseLink MOXy . Для этого я ввел следующий запрос на улучшение, добавьте дополнительную информацию, чтобы проголосовать за эту ошибку:

Длинный ответ

MOXy будет поддерживать отображение:

@XmlPath("items/item/@type")
private ArrayList<String> itemList = new ArrayList<String>();

до:

<test>
  <items>
    <item type="cookie"/>
    <item type="crackers"/>
  </items>
</test>

но не:

@XmlPath("items/item/@type")
private ArrayList<String> itemList = new ArrayList<String>();

@XmlPath("items/item/@brand")
private ArrayList<String> brandList = new ArrayList<String>();

до:

<test>
  <items>
    <item type="cookie" brand="oreo"/>
    <item type="crackers" brand="ritz"/>
  </items>
</test>

Обход

Вы можете ввести промежуточный объект (Item) для сопоставления этого варианта использования:

@XmlElementWrapper(name="items")
@XmlElement(name="item")
private ArrayList<Item> itemList = new ArrayList<Item>();

public class Item {

    @XmlAttribute
    private String type;

    @XmlAttribute
    private String brand;
}

Для получения дополнительной информации о @XmlPath

...