2013-04-29 58 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