Jaxb: Unmarshalling XML с несколькими пространствами имен в одном пакете
Я новичок в использовании пространств имен в XML, поэтому я немного растерялся и хотел бы получить некоторые разъяснения. У меня есть java-сервис, где я получаю XML-документы со многими различными пространствами имен, и, хотя у меня это работает, я чувствую, что, должно быть, сделал что-то не так, поэтому я хочу проверить. В моем package-info.java у меня есть аннотация схемы, такая как:
@javax.xml.bind.annotation.XmlSchema(
xmlns={
@javax.xml.bind.annotation.XmHS(prefix="train", namespaceURI="http://mycompany/train"),
@javax.xml.bind.annotation.XmHS(prefix="passenger", namespaceURI="http://mycompany/passenger")
},
elementFormDefault = javax.xml.bind.annotation.XmlNsForm=QUALIFIED
)
У меня есть Train.java с комментариями на уровне класса:
@XmlRootElement(name="Train", namespace="http://mycompany/train")
и каждое поле в классе помечено:
@XmlElement(name="Color") for example
Поезд содержит список пассажиров, так чтособственность
private Set passengers;
и эта коллекция помечена:
@XmlElementWrapper(name="Passengers")
@XmlElements(@XmlElement(name="Passenger", namespace="http://mycompany/passenger"))
Затем в Passenger.java сам класс помечается с помощью:
@XmlElement(name="Passenger", namespace="http://mycompany/passenger")
Наконец, для отдельных полей в Passenger.java они помечаются так:
@XmlElement(name="TicketNumber", namespace="http://mycompany/passenger")
Поэтому, когда у меня есть XML, который выглядит следующим образом:
Red
T101
Теперь я отменяю этот xml, который я получил, и Train 's свойство Color установлено и Passenger 's свойство TicketNumber установлено. Но я нене знаю, почему мне нужно добавить URL-адрес пространства имен в аннотации XmlElement в TicketNumber, чтобы это работало, но я этого не сделалЭто нужно сделать для свойства Color на Train. Если я удалю атрибут пространства имен из аннотации XmlElement в TicketNumber, значение из xml не будет сопоставлено с объектом, если я также не удалю префикс пространства имен из запроса xml. Я чувствую, так как яу нас есть атрибут пространства имен, определенный в XmlRootElement для Пассажира, я не долженне нужно делать это для каждого поля в классе, как яМне нужно тренироваться, поэтому я предполагаю, что у меня что-то не так. Может ли кто-нибудь указать мне правильное направление? Спасибо!