java - 使用 JaxB 编码实现公共(public)接口(interface)的对象列表

标签 java xml jaxb

我正在尝试编码实现公共(public)接口(interface)的对象列表。 涉及3个类和1个接口(interface):

Community 类(有一个方法:List getPeople();)

Person 接口(interface)(只有一种方法:String getName();)

Girl 类(实现 Person)

Boy 类(实现 Person)

参见下面的代码。

我想要一个看起来像这样的 XML:

<community>
  <people>
    <girl>
      <name>Jane</name>
    </girl>
    <boy>
      <name>John</name>
    </boy>
    <girl>
      <name>Jane</name>
    </girl>
    <boy>
      <name>John</name>
    </boy>
  </people>
</community>

或者可能:

<community>
  <people>
   <person>
      <girl>
        <name>Jane</name>
      </girl>
    </person>
    <person>
      <boy>
        <name>John</name>
      </boy>
    </person>
  </people>
</community>

到目前为止,我得到的是这样的:

<community>
    <people>
        <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="girl">
            <name>Jane</name>
        </person>
        <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="boy">
            <name>John</name>
        </person>
        <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="girl">
            <name>Jane</name>
        </person>
        <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="boy">
            <name>John</name>
        </person>
    </people>
</community>

我意识到我可以将元素更改为其他内容,但我希望元素名称是在 Girl 或 Boy 类中指定的名称。

这可以吗?谢谢。

@XmlRootElement(name = "community")
public class Community {

 private List<Person> people;

 @XmlElementWrapper
 @XmlElement(name="person")
 public List<Person> getPeople() {
  return people;
 }

 public Community() {
  people = new ArrayList<Person>();
  people.add(new Girl());
  people.add(new Boy());
  people.add(new Girl());
  people.add(new Boy());
 }
}







@XmlRootElement(name = "girl")
public class Girl implements Person {

 @XmlElement
 public String getName() {
  return "Jane";
 }
}


@XmlRootElement(name = "boy")
public class Boy implements Person {

 @XmlElement
 public String getName() {
  return "John";
 }
}



@XmlJavaTypeAdapter(AnyTypeAdapter.class)
public interface Person {
 public String getName();
}



public class AnyTypeAdapter extends XmlAdapter<Object, Object> {

 @Override
   public Object marshal(Object v) throws Exception {
    return v;
   }

 @Override
   public Object unmarshal(Object v) throws Exception {
    return v;
   }

}

最佳答案

对于这种情况,我建议使用@XmlElements。 @XmlElements 用于表示选择的 XML 模式概念:

这是您的示例的外观:

@XmlElements({ 
    @XmlElement(name="girl", type=Girl.class),
    @XmlElement(name="boy", type=Boy.class)
})
@XmlElementWrapper
public List<Person> getPeople() {
    return people;
}

@XmlElementRef 对应于 XML 模式中的替换组的概念。这就是为什么前面的答案要求将 Person 从接口(interface)更改为类的原因。

关于java - 使用 JaxB 编码实现公共(public)接口(interface)的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4144296/

相关文章:

java - 在 jsp 中设置 session 属性时遇到问题

xml - 为什么 XSD 说我的元素不完整?

Android xml CSS 类似布局边距

java - Apache CXF JAXB Marshaller 未正确编码 @XmlAttribute

java - 仅使用辅助全局索引查询 Dynamodb 表

java - JTree:TreeCellRenderer 未按预期执行

java - 我无法在一个 View 中将数据存储在对象中并从另一个 View 访问它(其中包含数据)

java - 为什么 Adapter 多次向 ListView 添加相同的位置?

jaxb - 防止 JAXB 在我的元素中转义 HTML 标记

java - 非无状态 JAXB XML 适配器