使用JaXB的类字段的属性
我试图简化POJO到XML的转换,但是我面临着类字段属性的问题 考虑以下XML文件使用JaXB的类字段的属性,jaxb,attributes,Jaxb,Attributes,我试图简化POJO到XML的转换,但是我面临着类字段属性的问题 考虑以下XML文件 <cat> <displayTexts> <displayText language="en">12</displayText> <displayText language="en">23</displayText> </displayTexts>
<cat>
<displayTexts>
<displayText language="en">12</displayText>
<displayText language="en">23</displayText>
</displayTexts>
</cat>
12
23
及
我有一节课
@XmlRootElement(name = "cat")
public class Category{
List<Integer> list;
public List<Integer> getList() {
return list;
}
@XmlElementWrapper(name = "displayTexts")
@XmlElement(name = "displayText")
public void setList(List<Integer> list) {
this.list = list;
}
}
@XmlRootElement(name=“cat”)
公共类类别{
名单;
公共列表getList(){
退货清单;
}
@XmlElementWrapper(name=“displayTexts”)
@xmlement(name=“displayText”)
公共无效集合列表(列表){
this.list=列表;
}
}
如何编写一个适配器来生成上面提到的XML
现在,它将生成类似以下xml的内容:
<cat>
<displayTexts>
<displayText>12</displayText>
<displayText>23</displayText>
</displayTexts>
</cat>
12
23
注意::我不允许使用MoXy。我知道我可以通过编写一个不同的类来实现这一点。问题是我们能不能编写一个适配器,这样我就可以对任何类字段概括这个属性?虽然我仍然建议使用一个类而不是整数来使用displayText及其属性的值,但是如果您想在没有任何新类的情况下实现,您可以在displayList中使用@XmlAnyElement并自己“创建”xml,进行以下操作:
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@XmlRootElement(name = "cat")
public class Category {
List<Integer> list;
@XmlAnyElement()
@XmlJavaTypeAdapter(MyIntegerAdapter.class)
public List<Integer> getList() {
return list;
}
//@XmlElement(name = "displayText")
public void setList(List<Integer> list) {
this.list = list;
}
public static void main(String[] args) throws Exception {
Category bx = new Category();
List<Integer> lists = Arrays.asList(121, 212);
bx.setList(lists);
JAXBContext jc = JAXBContext.newInstance(Category.class);
MyIntegerAdapter adapter = new MyIntegerAdapter();
Marshaller marrshaller = jc.createMarshaller();
marrshaller.setAdapter(adapter);
marrshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marrshaller.marshal(bx, System.out);
}
}
class MyIntegerAdapter extends XmlAdapter<Element, List<Integer>> {
private DocumentBuilder documentBuilder;
public MyIntegerAdapter() {
}
private DocumentBuilder getDocumentBuilder() throws Exception {
// Lazy load the DocumentBuilder as it is not used for unmarshalling.
if (null == documentBuilder) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
documentBuilder = dbf.newDocumentBuilder();
}
return documentBuilder;
}
@Override
public Element marshal(List<Integer> lists) throws Exception {
if (null == lists) {
return null;
}
Document document = getDocumentBuilder().newDocument();
Element element = document.createElement("displayTexts");
for (int value : lists) {
Element displayText = document.createElement("displayText");
System.out.println("value.." + value);
displayText.setTextContent(value + "");
displayText.setAttribute("Lang", "en");
element.appendChild(displayText);
}
return element;
}
@Override
public List<Integer> unmarshal(Element v) throws Exception {
//TODO
throw new UnsupportedOperationException();
}
}
导入java.util.array;
导入java.util.List;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.Marshaller;
导入javax.xml.bind.annotation.xmlanyement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.adapters.XmlAdapter;
导入javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
@XmlRootElement(name=“cat”)
公共类类别{
名单;
@xmlanyement()
@XmlJavaTypeAdapter(MyIntegerAdapter.class)
公共列表getList(){
退货清单;
}
//@xmlement(name=“displayText”)
公共无效集合列表(列表){
this.list=列表;
}
公共静态void main(字符串[]args)引发异常{
类别bx=新类别();
List=Arrays.asList(121212);
设置列表(列表);
JAXBContext jc=JAXBContext.newInstance(Category.class);
MyIntegerAdapter=新的MyIntegerAdapter();
Marshaller=jc.createMarshaller();
marrshaller.设置适配器(适配器);
setProperty(Marshaller.JAXB_格式化的_输出,Boolean.TRUE);
marrshaller.Marshaller.Marshaller.Marshaller(bx,系统输出);
}
}
类MyIntegerAdapter扩展了XmlAdapter{
私人文档生成器文档生成器;
公共MyIntegerAdapter(){
}
私有DocumentBuilder getDocumentBuilder()引发异常{
//延迟加载DocumentBuilder,因为它不用于解组。
if(null==documentBuilder){
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
documentBuilder=dbf.newDocumentBuilder();
}
返回文档生成器;
}
@凌驾
公共元素封送处理(列表)引发异常{
if(null==列表){
返回null;
}
Document Document=getDocumentBuilder().newDocument();
元素=document.createElement(“显示文本”);
for(int值:列表){
Element displayText=document.createElement(“displayText”);
System.out.println(“值..”+值);
displayText.setTextContent(值+“”);
setAttribute(“Lang”、“en”);
元素。追加子元素(显示文本);
}
返回元素;
}
@凌驾
公共列表解组器(元素v)引发异常{
//待办事项
抛出新的UnsupportedOperationException();
}
}
尽管我仍然建议使用类而不是整数来使用displayText及其属性的值,但如果您希望在不使用任何新类的情况下实现,您可以使用@XmlAnyElement为您的displayList创建以下快照,并亲自“创建”xml:
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@XmlRootElement(name = "cat")
public class Category {
List<Integer> list;
@XmlAnyElement()
@XmlJavaTypeAdapter(MyIntegerAdapter.class)
public List<Integer> getList() {
return list;
}
//@XmlElement(name = "displayText")
public void setList(List<Integer> list) {
this.list = list;
}
public static void main(String[] args) throws Exception {
Category bx = new Category();
List<Integer> lists = Arrays.asList(121, 212);
bx.setList(lists);
JAXBContext jc = JAXBContext.newInstance(Category.class);
MyIntegerAdapter adapter = new MyIntegerAdapter();
Marshaller marrshaller = jc.createMarshaller();
marrshaller.setAdapter(adapter);
marrshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marrshaller.marshal(bx, System.out);
}
}
class MyIntegerAdapter extends XmlAdapter<Element, List<Integer>> {
private DocumentBuilder documentBuilder;
public MyIntegerAdapter() {
}
private DocumentBuilder getDocumentBuilder() throws Exception {
// Lazy load the DocumentBuilder as it is not used for unmarshalling.
if (null == documentBuilder) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
documentBuilder = dbf.newDocumentBuilder();
}
return documentBuilder;
}
@Override
public Element marshal(List<Integer> lists) throws Exception {
if (null == lists) {
return null;
}
Document document = getDocumentBuilder().newDocument();
Element element = document.createElement("displayTexts");
for (int value : lists) {
Element displayText = document.createElement("displayText");
System.out.println("value.." + value);
displayText.setTextContent(value + "");
displayText.setAttribute("Lang", "en");
element.appendChild(displayText);
}
return element;
}
@Override
public List<Integer> unmarshal(Element v) throws Exception {
//TODO
throw new UnsupportedOperationException();
}
}
导入java.util.array;
导入java.util.List;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.Marshaller;
导入javax.xml.bind.annotation.xmlanyement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.adapters.XmlAdapter;
导入javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
@XmlRootElement(name=“cat”)
公共类类别{
名单;
@xmlanyement()
@XmlJavaTypeAdapter(MyIntegerAdapter.class)
公共列表getList(){
退货清单;
}
//@xmlement(name=“displayText”)
公共无效集合列表(列表){
this.list=列表;
}
公共静态void main(字符串[]args)引发异常{
类别bx=新类别();
List=Arrays.asList(121212);
设置列表(列表);
JAXBContext jc=JAXBContext.newInstance(Category.class);
MyIntegerAdapter=新的MyIntegerAdapter();
Marshaller=jc.createMarshaller();
marrshaller.设置适配器(适配器);
setProperty(Marshaller.JAXB_格式化的_输出,Boolean.TRUE);
marrshaller.Marshaller.Marshaller.Marshaller(bx,系统输出);
}
}
类MyIntegerAdapter扩展了XmlAdapter{
私人文档生成器文档生成器;
公共MyIntegerAdapter(){
}
私有DocumentBuilder getDocumentBuilder()引发异常{
//延迟加载DocumentBuilder,因为它不用于解组。
if(null==documentBuilder){
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
documentBuilder=dbf.newDocumentBuilder();
}
返回文档生成器;
}
@凌驾