如何在 JAXB 编组期间将包装器元素添加到 class
How to add wrapper element to class during the JAXB marshalling
我正在尝试使用 Moxy Marshalling
方法创建 XML
。除了一件小事外,一切似乎都运行良好。基本上,我想知道如何在编组期间将包装器元素添加到 class 本身。
正如我们所知,我们可以添加 @XmlPath("test/name/text()")
来为任何 String
元素添加包装器。同样对于收集,我们可以使用 @XmlElementWrapper(name="languages")
、@XmlElement(name="language")
。但这些是针对 class
中的字段。如何将包装器元素添加到正在编组的 class 本身?
我有以下 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
元素添加到整个 class 事件中,以便输出看起来像这样:(注意整个 customer
是 classWrapper
)
<classWrapper>
<customer>
<extension>
<name>Hello</name>
</extension>
<languages>
<language>English</language>
<language>UK English</language>
</languages>
</customer>
</classWrapper>
我尝试将 @XmlPath
和 @XmlElementWrapper
添加到 Customer
class 但它会抛出错误,因为它只能添加到 [= 中的字段55=] 但不是整个 class.
以下是我的 Main
class 将用于编组:
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
class 添加自定义字段,然后将 wrapper
class 用于 marshalling
。事实上,我现在也在做同样的事情。然而,试图找到是否有一些 Moxy
方法来做这类似于我们有 @XmlPath
和 @XmlElementWrapper
有人可以建议某种形式的 Moxy Jaxb
相关方法来实现整个 class 的包装器元素吗?
这是一个临时解决方法,对我来说可以正常工作。在这里发布答案,以便将来对某人有所帮助。
将 @XmlRootElement("customer")
更改为 @XmlRootElement("classWrapper")
。所以你会得到 classWrapper
作为外部元素。
然后使用 @XmlPath
更改 Customer
class 中的所有元素,以便所有元素都位于 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 -> elements -> element
然后是内容。
<extension>
<elements>
<element></element>
<element></element>
......
</elements>
</extension>
如果元素是 String
类型那么你必须使用 text()
@XmlPath("extension/elements/text()")
List<String> elements;
我正在尝试使用 Moxy Marshalling
方法创建 XML
。除了一件小事外,一切似乎都运行良好。基本上,我想知道如何在编组期间将包装器元素添加到 class 本身。
正如我们所知,我们可以添加 @XmlPath("test/name/text()")
来为任何 String
元素添加包装器。同样对于收集,我们可以使用 @XmlElementWrapper(name="languages")
、@XmlElement(name="language")
。但这些是针对 class
中的字段。如何将包装器元素添加到正在编组的 class 本身?
我有以下 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
元素添加到整个 class 事件中,以便输出看起来像这样:(注意整个 customer
是 classWrapper
)
<classWrapper>
<customer>
<extension>
<name>Hello</name>
</extension>
<languages>
<language>English</language>
<language>UK English</language>
</languages>
</customer>
</classWrapper>
我尝试将 @XmlPath
和 @XmlElementWrapper
添加到 Customer
class 但它会抛出错误,因为它只能添加到 [= 中的字段55=] 但不是整个 class.
以下是我的 Main
class 将用于编组:
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
class 添加自定义字段,然后将 wrapper
class 用于 marshalling
。事实上,我现在也在做同样的事情。然而,试图找到是否有一些 Moxy
方法来做这类似于我们有 @XmlPath
和 @XmlElementWrapper
有人可以建议某种形式的 Moxy Jaxb
相关方法来实现整个 class 的包装器元素吗?
这是一个临时解决方法,对我来说可以正常工作。在这里发布答案,以便将来对某人有所帮助。
将
@XmlRootElement("customer")
更改为@XmlRootElement("classWrapper")
。所以你会得到classWrapper
作为外部元素。然后使用
@XmlPath
更改Customer
class 中的所有元素,以便所有元素都位于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 -> elements -> element
然后是内容。
<extension>
<elements>
<element></element>
<element></element>
......
</elements>
</extension>
如果元素是 String
类型那么你必须使用 text()
@XmlPath("extension/elements/text()")
List<String> elements;