Как назначить логическое значение, основанное на существовании элемента в JAXB? - PullRequest
3 голосов
/ 11 мая 2011

Это в некоторой степени связано с этим вопросом и с этим вопросом , который я задал вчера.

Я хотел бы использовать логическое значение, чтобы определить, является ли элементсуществует в документе XML.Файлы, которые я анализирую, позволяют использовать такие элементы, как:

<FamilyMember>
    <Name>Jeff</Name>
</FamilyMember>
<FamilyMember>
    <Name>Spot</Name>
    <IsPet/>
</FamilyMember>

В этом примере элемент указывает, что FamilyMember является домашним животным, но нет никаких дополнительных данных, связанных с этим элементом.Я хотел бы быть в состоянии сказать JAXB возвращать логическое значение в зависимости от того, существует ли элемент в разобранном файле.Если элемент существует, значение должно быть истинным;в противном случае оно должно быть ложным.Я хотел бы сделать это изнутри схемы XSD, которую я использую для генерации своих классов Java, если это возможно.

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Вы должны быть в состоянии сделать это с помощью XmlAdapter, подобного следующему:

После получения ответа на ( Какуказать адаптер (ы), которые JAXB использует для маршалинга / демаршалинга данных? ) вы сможете применить адаптер.

Вот как это можно сделать.Обратите внимание, что следующий пример работает с использованием EclipseLink JAXB (MOXy) , но выдает исключение при использовании эталонной реализации JAXB.

FamilyMember

package example;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement(name="FamilyMember")
public class FamilyMember {

    private boolean pet;
    private String name;

    @XmlElementRef
    @XmlJavaTypeAdapter(IsPetAdapter.class)
    public boolean isPet() {
        return pet;
    }

    public void setPet(boolean pet) {
        this.pet = pet;
    }

    @XmlElement(name="Name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

IsPetAdapter

package example;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import forum204.IsPetAdapter.IsPet;

public class IsPetAdapter extends XmlAdapter<IsPet, Boolean> {

    @Override
    public Boolean unmarshal(IsPet v) throws Exception {
        return null != v;
    }

    @Override
    public IsPet marshal(Boolean v) throws Exception {
        if(v) {
            return new IsPet();
        }
        return null;
    }

    @XmlRootElement(name="IsPet")
    public static class IsPet {
    }

}

Демо

package example;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(FamilyMember.class);

        Unmarshaller unmarshaller= jc.createUnmarshaller();
        FamilyMember fm = (FamilyMember) unmarshaller.unmarshal(new File("input.xml"));

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(fm, System.out);
    }

}
0 голосов
/ 11 мая 2011

Ваш IsPet проявляется как логическое значение?В этом случае я бы предположил, что логическое значение будет нулевым, если его нет в XML.Я думаю этот вопрос указывает, что это так.

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