Ответ 1
Вы можете создать общий Wrapper
объект, например:
Упаковочный
Вы можете создать общий класс-оболочку с свойством List
, аннотированным с помощью @XmlAnyElement(lax=true)
. Тип объекта, который используется для заполнения этого списка, будет основываться на его корневом элементе (см. http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html).
package forum13272288;
import java.util.*;
import javax.xml.bind.annotation.XmlAnyElement;
public class Wrapper<T> {
private List<T> items = new ArrayList<T>();
@XmlAnyElement(lax=true)
public List<T> getItems() {
return items;
}
}
Адрес
Вам нужно будет аннотировать возможное содержимое списка с помощью @XmlRootElement
.
package forum13272288;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Address {
}
Person
package forum13272288;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Person {
}
Demo
Демо-код ниже демонстрирует, как использовать класс Wrapper
. Поскольку корневой элемент может быть другим, вам нужно будет указать, что вы хотите развязать класс оболочки. В качестве альтернативы вы можете использовать аннотацию @XmlElementDecl
для связывания нескольких корневых элементов с классом-оболочкой (см. http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html).
package forum13272288;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Wrapper.class, Person.class, Address.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StreamSource personsXML = new StreamSource("src/forum13272288/persons.xml");
JAXBElement<Wrapper> wrapper1 = unmarshaller.unmarshal(personsXML, Wrapper.class);
marshaller.marshal(wrapper1, System.out);
StreamSource addressesXML = new StreamSource("src/forum13272288/addresses.xml");
JAXBElement<Wrapper> wrapper2 = unmarshaller.unmarshal(addressesXML, Wrapper.class);
marshaller.marshal(wrapper2, System.out);
}
}
Выход
Ниже приведен результат запуска демонстрационного кода. Файлы persons.xml
и addresses.xml
выглядят так же, как и соответствующий вывод.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
<person/>
<person/>
</persons>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addresses>
<address/>
<address/>
</addresses>
Дополнительная информация