我很新來在xml中使用命名空間,所以我有點困惑並想要一些解釋。我有一個java服務,我正在接收帶有許多不同命名空間的xml文檔,雖然我得到它的工作,但我覺得我一定做了錯誤的事情,所以我想檢查。在我的package-info.java我有我的模式註釋,如:Jaxb:在同一個包中使用多個命名空間解組xml
@XmlRootElement(name="Train", namespace="http://mycompany/train")
和每個字段與註釋類:
@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上的一流水平與註解:
@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我收到和列車的顏色屬性設置和Passenger的TicketNumber屬性設置。但我不知道爲什麼我需要在TicketNumber的XmlElement註釋上添加名稱空間url才能工作,但我並不需要爲Train的Color屬性這樣做。如果我從TicketNumber的XmlElement批註中除去名稱空間屬性,則xml的值將不會映射到對象,除非我也從xml請求中除去命名空間前綴。我覺得既然我已經獲得了Passenger的XmlRootElement上定義的名稱空間屬性,我不需要爲類中的每個字段都這樣做,就像我不需要爲Train一樣,所以我假設我必須設置錯誤的東西。有人能指引我朝着正確的方向嗎?謝謝!
感謝超級徹底的答覆。這解決了我的問題,並像我想象的那樣工作。我錯誤地在每個「子類」中使用XmlRootElement,並在該註釋中聲明名稱空間而不是XmlType。 – Frequentcrasher
@Blaise Doughan請建議如果我可以使用相同的名稱空間沒有前綴。 –