2013-04-29 102 views
1

我對XML非常陌生,我遇到了一個問題,我無法解決問題,並且在查找幾個小時後我決定發佈我的問題。@XmlIDREF在編組爲XML時沒有看到層次結構

我正在使用@XmlIDREF只是XML文檔上的一些java類的XmlID。 所有的工作都很好,但是當JAXB尋找依賴於樹層次結構的ID時,似乎無法找到它並再次釋放整個對象。

我會告訴你(簡化)模型,它是所有關於光路由器的java類代表了路由器和一些組件:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class OpticalRouter { 
    // @XmlID inherited from upper class 
    private List<FiberConnection> fiberConnections = new ArrayList<FiberConnection>(); 
} 

這是一個光纖連接:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class FiberConnection { 

    @XmlID 
    private String instanceID; 

    @XmlIDREF 
    Card card;    

    @XmlIDREF 
    Port port; 

    @XmlIDREF 
    Channel channel; 
} 

而且終於:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlSeeAlso({ 
     DropCard.class, 
     AddCard.class 
}) 
public class Card{ 
    // @XmlID inherited from supper class  
} 

所有工作正常,當我馬歇爾端口頻道,因爲他們沒有子類....但是當它是時間編組如果它是一個AddCard或DropCard它封送它另一次,而不是使用IDREF。 看來,JAXB沒有找到他們的層次結構...

如果我改變原來的「卡卡」, FiberConnection爲「AddCard」,例如它也可以工作(JAXB找到IdREF並且不再編組它)。

希望我解釋清楚。 問如果不是,我會很高興回答:)

在此先感謝!



EDITED

好吧,我回來了新的信息和結果,以更好地解釋自己。

由於它是一個龐大的類模型,我不想讓帖子難以閱讀,所以我創建了一種UML類圖,使它更易於閱讀,這些信息應該有助於幫助(XML註釋和參數)。我還包括@XmlElement標籤,正如Blaise告訴我的一樣(再次感謝)。

  • 在這裏你可以找到YED UML存檔yEd file
  • 還有一個UML JPG如果你沒有/想下載圖形 編輯:jpg file

我還包括(完成)XML的一部分以更好地瞭解發生了什麼。

在這裏我有一個fiberConnection如上所述。

我有一個scCardfiberChannelPlan已經之前的XML文檔(檢查),但他們正在重新整理 ...編組

在交流中,srcPort,srcChannelfiberChannels,也編制過,只有他們的ID。

<OpticalRouter> 
<fiberConnections> 
     <instanceID>[email protected]</instanceID> 
     <srcCard xsi:type="DropCard" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">       
      <instanceID>[email protected]</instanceID>    
      <type>11</type> 
      <subtype>1</subtype> 
      <chasis>0</chasis>   
      <fiberChannelPlan xsi:type="ChannelPlan"> 
       <instanceID>[email protected]</instanceID> 
       <firstChannel>0</firstChannel> 
       <lastChannel>0</lastChannel>     
       <maxFreq>196.1</maxFreq> 
       <minFreq>191.6</minFreq>         
       <fiberChannels>Channel/360</fiberChannels> 
       <fiberChannels>Channel/368</fiberChannels> 
       <fiberChannels>Channel/376</fiberChannels> 
       <fiberChannels>Channel/384</fiberChannels> 
      </fiberChannelPlan>    
      <cardExpressPort>[email protected]</cardExpressPort> 
      <carCommonPort>[email protected]</carCommonPort> 
     </srcCard> 
     <srcPort>[email protected]</srcPort> 
     <srcChannel>Channel/184</srcChannel> 
    </fiberConnections> 
</OpticalRouter> 

我認爲這個問題是關係到那個帖子,我發現(即使我使用Linux和Java 1.6)或我在這裏看到的StarckOverflow其他職位的東西: java.net/jira/browse/JAXB-870

在此先感謝!

P.S:我使用的所有代碼都是開源的,如果有人認爲它應該對他更容易,可以從git倉庫的主要源代碼下載。

+0

也許我很困惑,但我不認爲這裏所說的'ports'或'channels'任何成員 - 是一些這些集合排序,你沒有向我們展示? – 2013-04-29 17:47:44

+0

Nop。我忘了發佈它,但**端口**和**頻道**都是類似**卡**。 我一直在做一些測試,我會更新信息更多的信息。 謝謝彼得! – 2013-05-01 19:18:12

+0

還在做一些測試,什麼也沒有... 任何人都知道,如果重寫編組函數我可以以IDREF看到它的某種方式更改ID? – 2013-05-16 11:54:41

回答

0

您需要確保圖中的每個對象都通過包含/嵌套關係(如@XmlElement)引用,這就形成了XML。我沒有看到你的模型滿足這個要求。然後,您可以使用@XmlID/@XmlIDREF在樹中具有基於關鍵字的關係,將其轉化爲圖形。

更多信息

+1

謝謝布萊斯,我不知道。 我會嘗試一下,結果回來。 親切的問候。 – 2013-04-30 21:14:25

+0

編輯帖子,非常感謝您的時間和耐心。 – 2013-05-02 16:25:18