Я новичок в использовании пространств имен в 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<Passenger> 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, который выглядит так:
<train:Train>
<train:Color>Red</train:Color>
<train:Passengers>
<train:Passenger>
<passenger:TicketNumber>T101</passenger:TicketNumber>
</train:Passenger>
</train:Passengers>
</train:Train>
Теперь я отменяю этот xml, который я получил, и свойство Train Color установлено, и установлено свойство Passenger TicketNumber. Но я не знаю, почему мне нужно добавить URL-адрес пространства имен в аннотации XmlElement в TicketNumber, чтобы это работало, но мне не нужно было делать это для свойства Color на Train. Если я удалю атрибут пространства имен из аннотации XmlElement в TicketNumber, значение из xml не будет сопоставлено с объектом, если я также не удалю префикс пространства имен из запроса xml. Я чувствую, что, поскольку у меня есть атрибут пространства имен, определенный в XmlRootElement для Пассажира, мне не нужно будет делать это для каждого отдельного поля в классе, как и в случае, когда мне не нужно было тренироваться, поэтому я предполагаю, что я должен установить что-то неправильно. Может ли кто-нибудь указать мне в правильном направлении? Спасибо!