编组XML时@XmlIDREF没有看到层次结构

时间:2013-04-29 17:31:36

标签: java xml xml-parsing jaxb hierarchy

我是XML新手,我遇到了一个问题我无法解决,经过几个小时的讨论,我决定发布我的问题。

我正在使用@XmlIDREF来获取XML doc上某些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    
} 

当我对端口频道进行编组时,一切正常,因为他们没有子类....但是当时需要编组卡 strong>如果它是AddCard或DropCard,它会再次编组它而不是使用IDREF。 似乎JAXB在层次结构中找不到它们......

如果我更改原来的“卡片卡”;例如,对于“AddCard”的FiberConnection,它也可以工作(JAXB找到IdREF并且不再对其进行编组)。

希望我已经清楚地解释了这一点。 如果没有,我会很乐意回答:)

提前致谢!



EDITED

好的,我带回了新的信息和结果来更好地解释自己。

由于它是一个庞大的类模型,我不想让帖子难以阅读我创建了一种UML类图,使其更易于阅读,并提供一些应该有用的重要信息(XML注释)和参数)。我还包括@XmlElement标签,Blaise建议我(再次感谢)。

  • 您可在此处找到 yEd UML存档yEd file
  • 如果您没有/想要下载图表,那么 UML jpg 编辑:jpg file

我还包括(完成)XML的一部分,以便更好地了解正在发生的事情。

这里我有一个如上所述的光纤连接。

我有一个 scCard 和一个 fiberChannelPlan 之前已经编组在XML文档上(已选中)但他们是再次被集结 ......

作为交换,之前编组过的 srcPort srcChannel fiberChannels 只有他们的ID。

<OpticalRouter>
 <fiberConnections>
        <instanceID>FiberConnection@29e83b01</instanceID>
        <srcCard xsi:type="DropCard" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">                        
            <instanceID>DropCard@6b02b23d</instanceID>            
            <type>11</type>
            <subtype>1</subtype>
            <chasis>0</chasis>          
            <fiberChannelPlan xsi:type="ChannelPlan">
                <instanceID>ChannelPlan@7e246b6d</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>Port@4f781d1d</cardExpressPort>
            <carCommonPort>Port@56bf83ad</carCommonPort>
        </srcCard>
        <srcPort>Port@56bf83ad</srcPort>
        <srcChannel>Channel/184</srcChannel>
    </fiberConnections>
</OpticalRouter>

我认为这个问题与我发现的帖子有关(即使我使用的是linux和java 1.6)或者我在StarckOverflow上看过的其他帖子: java.net/jira/browse/JAXB-870

提前致谢!

P.S:我正在使用的所有代码都是开源代码,如果有人认为对他来说应该更容易,可以从git存储库的主要源代码下载。

1 个答案:

答案 0 :(得分:0)

您需要确保图表中的每个对象都通过包含/嵌套关系(例如@XmlElement)引用,这就形成了XML。我没有看到您的模型中满足此要求的位置。然后,您可以使用@XmlID/@XmlIDREF在树中创建基于关键字的关系,将其转换为图形。

了解更多信息