【问题标题】:How to add wrapper element to class during the JAXB marshalling如何在 JAXB 编组期间将包装器元素添加到类
【发布时间】:2021-08-09 07:31:13
【问题描述】:

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

正如我们所知,我们可以添加 @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 相关方法来实现整个班级的包装元素吗?

【问题讨论】:

  • 我能够找到解决此问题的临时解决方法。我在这里发布相同的内容。如果我能找到不同的东西,我会在这里更新。

标签: java xml jaxb marshalling moxy


【解决方案1】:

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

  1. @XmlRootElement("customer") 更改为@XmlRootElement("classWrapper")。所以你会得到classWrapper 作为外部元素。

  2. 然后使用@XmlPath 更改Customer 类中的所有元素,以便所有元素都位于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 时的提示: 如果text()不是String、Date等简单类型,请勿使用。

例如,如果元素是Custom 类型和List,则不要使用/text()

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

这将添加extension -&gt; elements -&gt; element 然后是内容。

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

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

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

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 2010-12-17
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多