Как (отменять) маршалинг значения корневого элемента в подклассе - PullRequest
0 голосов
/ 17 апреля 2019

Я демонтирую сложный объект из XML в Java, используя JAXB. Проблемная часть XML выглядит следующим образом:

<product>
    <!-- SNIP -->
    <keywords>
        <keyword optionalAttribute="attrValue">Value</keyword>
        <keyword>Another value</keyword>
    </keywords>
</product>

У меня есть класс Java для родительского объекта и для сложных атрибутов, включая ключевые слова, с аннотациями javax.xml.bind.annotation.*.

@XmlRootElement(name = "product")
@XmlAccessorType(XmlAccessType.NONE)
public class Product extends Model {

    // SNIP

    @XmlElementWrapper(name = "keywords")
    @XmlElement(name = "keyword")
    public List<ProductKeyword> keywords;
}
@XmlRootElement(name = "keyword")
@XmlAccessorType(XmlAccessType.NONE)
public class ProductKeyword extends Model {

    @XmlAttribute(name = "optionalAttribute")
    public String optionalAttribute;

    @XmlMixed
    public String keyword;

}

Поле ProductKeyword.keyword должно содержать значение элемента <keyword>, который является корневым элементом для подкласса. @XmlMixed, похоже, не побуждает JAXB пытаться разобрать что-либо в этом поле.

Я считаю, что мне нужно @XmlValue, но эту аннотацию нельзя использовать на подклассе (если, возможно, суперкласс не помечен @XmlTransient.)

Кто-нибудь может предложить способ обойти это?

Ограничения:

  • Я не могу изменить формат XML.

  • Я не могу избавиться от суперкласса Model (необходим для постоянства)

  • Я не могу изменить суперкласс (из внешней библиотеки)

Не ограничения:

  • Я могу, если нужно, добавить дополнительные поля в родительские или дочерние классы Java.

  • Если я могу получить значения ключевых слов в классе в любой форме или любым способом, я могу выполнить любую последующую обработку, необходимую для получения его в нужном месте / формате.

  • Это не должно быть красиво.

1 Ответ

1 голос
/ 17 апреля 2019

Я трид в своем коде, вы можете попробовать еще раз! Добавил эту зависимость в вас, Maven или скачал флягу.

 <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.moxy</artifactId>
            <version>2.5.0-RC1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.eclipse.persistence</groupId>
                    <artifactId>commonj.sdo</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

Тогда вам не нужно менять свое pojo! просто измени способ, которым ты unmarshal! Я храню XML-файл в файле, который вы можете использовать по-своему, inputtream или любой другой.

public static void main(String[] args) throws JAXBException, IOException {
        JAXBContext context = JAXBContextFactory.createContext(new Class[]{Product.class}, new HashMap());
        Unmarshaller unmarshaller = context.createUnmarshaller();
        InputStream is = new ClassPathResource("stand.xml").getInputStream();
        Product product= (Product) unmarshaller.unmarshal(is);
        System.out.println(product);
    }

Success

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...