有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java@XmlIDREF在编组为XML时看不到层次结构

我对XML非常陌生,我遇到了一个无法解决的问题,在四处寻找了几个小时后,我决定发布我的问题

我使用@XmlIDREF在XML文档中只包含一些java类的XmlID。 所有这些都可以正常工作,但是当JAXB根据树层次结构查找ID时,它似乎找不到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标记(再次感谢)

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

我还包括(完成)XML的一部分,以便更好地了解发生了什么

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

我有一张SC卡和一张光纤通道计划,它们在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上看到的其他帖子有关: JAVAnet/jira/browse/JAXB-870

提前谢谢

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


共 (1) 个答案

  1. # 1 楼答案

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

    了解更多信息