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,想也许我可以给class
Input
一个字段
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