如何用JAXB抑制标签名并获取值?生成指定XML结构的方法
解决JAXB生成目标XML结构的问题
我来帮你快速搞定这个问题!你现在遇到的情况是JAXB默认把Field类的value属性映射成了<value>子元素,但我们需要把它直接作为<field>标签的文本内容,同时让name成为<field>的属性。只需要给Field类加上两个关键的JAXB注解就能完美解决,步骤如下:
1. 修改Field类的注解
核心就是用@XmlAttribute标记name属性(让它成为XML元素的属性),用@XmlValue标记value属性(让它成为XML元素的文本内容)。具体代码如下:
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlValue; public class Field { private String name; private String value; @XmlAttribute(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlValue public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
2. 确保Elem和Batch类的注解正确
Elem类里的ArrayList<Field>需要用@XmlElement(name = "field")指定每个列表元素对应的XML标签名是field;Batch类作为根元素,用@XmlRootElement标记,同时给elem属性加上@XmlElement(name = "elem"):
Elem类代码
import javax.xml.bind.annotation.XmlElement; import java.util.ArrayList; import java.util.List; public class Elem { private List<Field> fields = new ArrayList<>(); @XmlElement(name = "field") public List<Field> getFields() { return fields; } public void setFields(List<Field> fields) { this.fields = fields; } }
Batch类代码
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "batch") public class Batch { private Elem elem; @XmlElement(name = "elem") public Elem getElem() { return elem; } public void setElem(Elem elem) { this.elem = elem; } }
3. 测试编组代码
写个简单的测试类验证一下,生成的XML就会完全符合你的目标结构:
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; public class JAXBTest { public static void main(String[] args) throws JAXBException { // 构建测试数据 Batch batch = new Batch(); Elem elem = new Elem(); Field countryField = new Field(); countryField.setName("country"); countryField.setValue("US"); Field criteriaField = new Field(); criteriaField.setName("criteria"); criteriaField.setValue("Test criteria"); elem.getFields().add(countryField); elem.getFields().add(criteriaField); batch.setElem(elem); // 生成格式化的XML JAXBContext context = JAXBContext.newInstance(Batch.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(batch, System.out); } }
运行这段代码后,输出的XML就是你想要的样子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <batch> <elem> <field name="country">US</field> <field name="criteria">Test criteria</field> </elem> </batch>
关键注解说明
@XmlAttribute:将Java属性映射为对应XML元素的属性,这里就是把name变成<field>的name属性。@XmlValue:将Java属性映射为对应XML元素的文本内容,注意一个类里只能有一个@XmlValue注解,且对应的属性必须是字符串或基本数据类型(你的value是String,完全符合要求)。
这样处理既高效又简洁,完全不需要额外的复杂配置,直接通过注解就能实现目标XML结构。
内容的提问来源于stack exchange,提问作者Advisor
相关产品推荐
相关产品推荐

