Jaxb 当您没有';我不知道引用的元素/类
当您不知道引用的元素类型将是什么时,如何处理引用 我有一个元素Jaxb 当您没有';我不知道引用的元素/类,jaxb,Jaxb,当您不知道引用的元素类型将是什么时,如何处理引用 我有一个元素,它是一个数据接收器。元素有一个属性source,该属性指定(通过XmlIDREF引用)数据的来源。source引用的元素可以是多个元素之一 下面是我正在使用的测试文档中的一个示例,其中的源代码有时引用元素,有时引用(这些不一定是它可以引用的唯一元素): 然后所有对元素的引用都能正常工作,但对于其余元素,它们的源代码是null。也就是说,如果我要设置一个toString()来显示类和id并打印上面的输入,我会得到 Source: po
,它是一个数据接收器。元素
有一个属性source
,该属性指定(通过XmlIDREF
引用)数据的来源。source
引用的元素可以是多个元素之一
下面是我正在使用的测试文档中的一个示例,其中
的源代码有时引用
元素,有时引用
(这些不一定是它可以引用的唯一元素):
然后所有对
元素的引用都能正常工作,但对于其余元素,它们的源代码是null
。也就是说,如果我要设置一个toString()
来显示类和id并打印上面的输入,我会得到
Source: position
null
Source: normal
第一行将正确引用第一个
元素,第二行(我想引用
元素)将为null
,第三行将引用第二个
元素
如果我将Input
改为使用字段顶点源
,那么我将得到null
顶点
和null
。这是有道理的
如何构造Java代码来处理这个问题
我研究了XmlAdapter,想也许我可以给classInput
一个字段objectsource
或MySuperClass source
(并创建source
和顶点
子类)或JAXBElement source
,然后尝试转换适配器代码中的内容,但是我如何保存id引用呢
我研究了XmlType
和工厂使用情况,但这似乎根本不是我想要的,或者至少我不知道它是如何应用的,尽管它一开始听起来像是一个很好的候选者
谷歌搜索相关术语会产生其他人所遇到的各种不相关的引用问题
我在想,不管怎么做,有两件事必须是真的:
1) 源
和顶点
(以及输入
可以引用其源
字段的所有其他内容)必须扩展一个通用的超类。
或
2) Input
将有一个Source source1
和一个source2
(依此类推,到ClassN sourcen
),其中一个将引用某个内容,而所有其他内容将为空
我对这两种方案中的任何一种都很满意,也可以选择其他方案,只要它能解组所有数据并保留引用,这样我就可以获得所有信息。我就是想不出合适的方法把它拆开
我无法控制我得到的xml。xml文档由其他程序创建,模式遵循大型规范()。我只编写必要的Java代码来解组xml并使用这些文件中的数据
我昨晚刚开始使用jaxb,它工作得很好(开发者们再次感到荣幸),但还有一些类似的问题需要解决。Root
@XmlIDREF
引用的每个对象也需要通过嵌套关系进行引用。它们并不都需要像本例中那样由同一个类引用
import java.util.List;
导入javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
公共类根{
@XmlElementWrapper
@xmlement(name=“foo”)
私人名单;
@XmlElementWrapper
@xmlement(name=“bar”)
私人酒吧名单;
}
Foo
用@XmlIDREF
注释的属性将匹配任何类型的任何元素,无论它出现在文档中的何处
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
公开课Foo{
@XmlID
@XmlAttribute
私有字符串id;
@XmlIDREF
@XmlAttribute
私有对象引用;
}
栏
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
公共类酒吧{
@XmlID
@XmlAttribute
私有字符串id;
}
演示
导入java.io.File;
导入javax.xml.bind.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(Root.class);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
文件xml=新文件(“src/forum17799549/input.xml”);
Root=(Root)unmarshaller.unmarshal(xml);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.marshall(root,System.out);
}
}
input.xml/Output
了解更多信息
根
@XmlIDREF
引用的每个对象也需要通过嵌套关系进行引用。它们并不都需要像本例中那样由同一个类引用
import java.util.List;
导入javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
公共类根{
@XmlElementWrapper
@xmlement(name=“foo”)
私人名单;
@XmlElementWrapper
@xmlement(name=“bar”)
私人酒吧名单;
}
Foo
用@XmlIDREF
注释的属性将匹配任何类型的任何元素,无论它出现在文档中的何处
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
公开课Foo{
@Xm
class Input
{
Source source;
}
Source: position
null
Source: normal