Ответ 1
Ниже приводится объяснение того, как пространство имен работают в JAXB (JSR-222) на основе модели.
JAVA MODEL
пакет-инфо
Ниже представлена измененная версия аннотации @XmlSchema
. Он содержит некоторую ключевую информацию:
-
namespace
- пространство имен по умолчанию, который будет использоваться, чтобы претендовать глобальные элементы (те, которые соответствуют@XmlRootElement
и@XmlElementDecl
аннотаций (и локальных элементов на основеelementFormDefault
значение), которые не имеют другого пространства имен, указанный. -
elementFormDefault
по умолчанию только глобальные элементы имеют пространство имен, но, устанавливая значениеXmlNsForm.QUALIFIED
, все элементы без явного указанного пространства имен будут квалифицированы с помощью значенияnamespace
. -
xmlns
является предпочтительным набором префиксов, которые JAXB impl должен использовать для этих пространств имен (хотя они могут использовать другие префиксы).
@XmlSchema(
namespace="http://mycompany/train",
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns={
@XmlNs(prefix="train", namespaceURI="http://mycompany/train"),
@XmlNs(prefix="passenger", namespaceURI="http://mycompany/passenger")
}
)
package forum15772478;
import javax.xml.bind.annotation.*;
Поезд
Поскольку все элементы, соответствующие классу Train
, соответствуют namespace
, указанным в аннотации @XmlSchema
, нам не нужно указывать какую-либо информацию о пространстве имен.
- Глобальные элементы. Аннотация
@XmlRootElement
соответствует глобальному элементу. - Локальные элементы - аннотации
@XmlElementWrapper
и@XmlElement
соответствуют локальным элементам.
package forum15772478;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Train")
public class Train {
private List<Passenger> passengers;
@XmlElementWrapper(name="Passengers")
@XmlElement(name="Passenger")
public List<Passenger> getPassengers() {
return passengers;
}
public void setPassengers(List<Passenger> passengers) {
this.passengers = passengers;
}
}
Passenger
Если все элементы, соответствующие свойства на Passenger
класс будет в http://mycompany/passenger
пространства имен, то вы можете использовать @XmlType
аннотацию переопределить namespace
от @XmlSchema
аннотации.Р >
package forum15772478;
import javax.xml.bind.annotation.*;
@XmlType(namespace="http://mycompany/passenger")
public class Passenger {
private String ticketNumber;
@XmlElement(name="TicketNumber")
public String getTicketNumber() {
return ticketNumber;
}
public void setTicketNumber(String ticketNumber) {
this.ticketNumber = ticketNumber;
}
}
В качестве альтернативы вы можете переопределить пространство имен на уровне свойств.
package forum15772478;
import javax.xml.bind.annotation.*;
public class Passenger {
private String ticketNumber;
@XmlElement(
namespace="http://mycompany/passenger",
name="TicketNumber")
public String getTicketNumber() {
return ticketNumber;
}
public void setTicketNumber(String ticketNumber) {
this.ticketNumber = ticketNumber;
}
}
DEMO CODE
Следующий демонстрационный код может быть запущен, чтобы доказать, что все работает:
Demo
package forum15772478;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Train.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum15772478/input.xml");
Train train = (Train) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(train, System.out);
}
}
Input.xml/выход
В XML ниже я добавил необходимые объявления пространства имен, отсутствующие в документе XML в вашем вопросе.
<train:Train
xmlns:train="http://mycompany/train"
xmlns:passenger="http://mycompany/passenger">
<train:Color>Red</train:Color>
<train:Passengers>
<train:Passenger>
<passenger:TicketNumber>T101</passenger:TicketNumber>
</train:Passenger>
</train:Passengers>
</train:Train>
ДЛЯ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ