我是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建议我(再次感谢)。
我还包括(完成)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存储库的主要源代码下载。
答案 0 :(得分:0)
您需要确保图表中的每个对象都通过包含/嵌套关系(例如@XmlElement
)引用,这就形成了XML。我没有看到您的模型中满足此要求的位置。然后,您可以使用@XmlID/@XmlIDREF
在树中创建基于关键字的关系,将其转换为图形。
了解更多信息