Jestem nowy w używaniu przestrzeni nazw w xml, więc jestem trochę zdezorientowany i chciałbym wyjaśnienia. Mam usługę java, w której otrzymuję dokumenty xml z wieloma różnymi przestrzeniami nazw i podczas gdy ja działam, czuję, że musiałem zrobić coś złego, więc chcę to sprawdzić. W moim package-info.java mam schematu adnotacji, takich jak:Jaxb: Unmarshalling xml z wieloma przestrzeniami nazw w tym samym pakiecie
@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
)
Mam Train.java odnotowany na poziomie klasy z:
@XmlRootElement(name="Train", namespace="http://mycompany/train")
i każdego pola w klasie, z dopiskiem :
@XmlElement(name="Color") for example
Pociąg zawiera listę pasażera (ów), więc nie jest to własność
private Set<Passenger> passengers;
i ta kolekcja jest opatrzone:
@XmlElementWrapper(name="Passengers")
@XmlElements(@XmlElement(name="Passenger", namespace="http://mycompany/passenger"))
Następnie w ciągu Passenger.java sama klasa jest opatrzone:
@XmlElement(name="Passenger", namespace="http://mycompany/passenger")
Wreszcie dla poszczególnych dziedzinach objętych Passenger.java, są one opatrzone tak :
@XmlElement(name="TicketNumber", namespace="http://mycompany/passenger")
Więc kiedy mam xml, który wygląda tak:
<train:Train>
<train:Color>Red</train:Color>
<train:Passengers>
<train:Passenger>
<passenger:TicketNumber>T101</passenger:TicketNumber>
</train:Passenger>
</train:Passengers>
</train:Train>
Odczytam teraz ten xml, który otrzymałem, a właściwość Kolor pociągu jest ustawiona, a właściwość TicketNumber Pasażera jest ustawiona. Ale nie wiem, dlaczego muszę dodać adres URL przestrzeni nazw na adnotacji XmlElement na TicketNumber, aby to działało, ale nie musiałem tego robić dla właściwości Color w Train. Jeśli usunę atrybut namespace z adnotacji XmlElement na TicketNumber, wartość z xml nie zostanie zmapowana do obiektu, chyba że usunę prefiks przestrzeni nazw z żądania xml. Czuję się tak, ponieważ mam atrybut przestrzeni nazw zdefiniowany w XmlRootElement dla Pasażera, nie powinienem tego robić dla każdego pola w klasie, tak jak nie musiałem tego dla Train, więc zakładam, że musiałem skonfigurować coś źle. Czy ktoś może wskazać mi właściwy kierunek? Dzięki!
Dzięki za super dokładnej odpowiedzi. To rozwiązało mój problem i działa tak, jak sobie wyobrażałem. Używałem XmlRootElement w każdej "klasie podrzędnej" błędnie i deklarując przestrzeń nazw w tej adnotacji zamiast XmlType. – Frequentcrasher
@ Blaise Doughan Proszę zasugerować, czy mogę użyć tego samego bez prefiksów dla obu przestrzeni nazw. –