1

我是 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 在层次结构中找不到它们......

如果我改变原来的“卡卡”;例如,“AddCard”的 FiberConnection 也可以工作(JAXB 找到 IdREF 并且不会再次编组它)。

希望我已经解释清楚了。如果没有,我会很高兴回答:)

提前致谢!



已编辑

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

由于它是一个巨大的类模型,我不想让帖子变得难以阅读,我创建了一种 UML 类图,以便通过一些应该有帮助的重要信息(XML 注释和参数)更容易阅读. 正如 Blaise 建议的那样,我还包含了 @XmlElement 标签(再次感谢)。

  • 在这里您可以找到yEd UML 存档yEd 文件
  • 如果您没有/想要下载图形编辑器 ,还有一个UML jpg : jpg 文件

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

在这里,我有一个如上所述的 fiberConnection。

我有一个scCard和一个FiberChannelPlan,之前已经在 XML 文档上编组(检查)但它们正在再次编组......

作为交换,srcPortsrcChannelfiberChannels,之前也编组过,只有它们的 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

提前致谢!

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

4

1 回答 1

0

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

了解更多信息

于 2013-04-30T11:31:09.443 回答