微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 JAXB 编组期间向类添加包装器元素

如何解决如何在 JAXB 编组期间向类添加包装器元素

我正在尝试使用 XML 方法创建 Moxy Marshalling。除了一件小事外,一切似乎都运行良好。基本上,我想知道如何在编组期间向类本身添加包装元素。

正如我们所知,我们可以添加 @XmlPath("test/name/text()") 以向任何 String 元素添加包装器。同样对于收集,我们可以使用 @XmlElementWrapper(name="languages"),@XmlElement(name="language")。但这些是针对 class 中的字段。如何将包装元素添加到正在编组的类本身?

我有以下课程:

@XmlRootElement(name = "customer")
@XmlType(name="customer",propOrder={"name","languages"})
@XmlAccessorType(XmlAccesstype.FIELD)   
public class Customer{
    
    @XmlPath("extension/name/text()")
    private String name;
    
    @XmlElementWrapper(name = "languages")
    @XmlElement(name = "language")
    private List<String> languages;
    
    //Getter,Setter and other constuctors
}

这将产生如下输出 XML

<customer>
    <extension>
        <name>Hello</name>
    </extension>
    <languages>
        <language>English</language>
        <language>UK English</language>
    </languages>
</customer>

但是,我想将 wrapper 元素添加到整个类的事件中,以便输出看起来像这样:(注意整个 customerclassWrapper 内的包装器)

<classWrapper>
    <customer>
        <extension>
            <name>Hello</name>
        </extension>
        <languages>
            <language>English</language>
            <language>UK English</language>
        </languages>
    </customer>
</classWrapper>

我尝试将 @XmlPath@XmlElementWrapper 添加Customer 类,但它引发错误,因为它只能添加到类中的字段,而不能添加到整个类。

以下是用于编组的 Main 类:

public class HelloWorld{

     public static void main(String []args){
        Customer customer = new Customer();
        
        List<String> languages = new ArrayList<String>();
        languages.add("English");
        languages.add("UK English");
        
        customer.setName("Hello");
        customer.setLanguages(languages);
        
        JAXBContext context = JAXBContext.newInstance(Customer.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
        marshaller.marshal(customer,System.out);
     }
}

我知道我可以编写另一个 wrapper 类,将自定义字段添加到其中,然后将该 wrapper 类用于 marshalling。其实,我现在也是这样。然而,试图找出是否有一些 Moxy方法来做到这一点,类似于我们有 @XmlPath@XmlElementWrapper

有人可以建议某种形式的 Moxy Jaxb 相关方法来为整个类实现包装元素吗?

解决方法

这是一种临时解决方法,对我来说按预期工作。在此处发布答案,以便将来对某人有所帮助。

  1. @XmlRootElement("customer") 更改为 @XmlRootElement("classWrapper")。因此,您将获得 classWrapper 作为外部元素。

  2. 然后使用 Customer 更改 @XmlPath 类中的所有元素,以便所有元素都位于 Customer 标记下。所以整体 customer.class 看起来像这样:

    @XmlRootElement(name = "classWrapper")
    @XmlType(name="customer",propOrder={"name","languages"})
    @XmlAccessorType(XmlAccessType.FIELD)
    @Getter
    @Setter
    public class Customer{
    
      @XmlPath("customer/extension/name/text()")
      private String name;
    
      @XmlPath("customer/languages/language/text()")
      private List<String> languages;
    
      //Getter,Setter and other constuctors
    }

使用 @XmlPath 时的提示: 如果不是简单类型(如 String、Date 等类型),请勿使用 text()

例如,如果元素是带有 CustomList 类型,则不要使用 /text()

@XmlPath("extension/elements/element")
List<myType> elements;

这将添加 extension -> elements -> element 然后内容。

<extension>
<elements>
<element></element>
<element></element>
......
</elements>
</extension>

如果元素是 String 类型,那么你必须使用 text()

@XmlPath("extension/elements/text()")
List<String> elements;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?