接下来呢?
使用Eclipselink JAXB(MOXy),您可以执行以下操作。注意:我是MOXy技术负责人。
测试
import java.util.ArrayList;import java.util.List;import javax.xml.bind.Unmarshaller;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;import org.eclipse.persistence.oxm.annotations.XmlPath;@XmlRootElement@XmlType(propOrder={"somevalue", "fields"})@XmlAccessorType(XmlAccessType.FIELD)class Test { @XmlJavaTypeAdapter(SomevalueAdapter.class) @XmlPath("fields[1]") boolean somevalue; @XmlJavaTypeAdapter(FieldsAdapter.class) List<Field> fields = new ArrayList<Field>(); public Boolean isSomevalue() { return somevalue; } public void setSomevalue(boolean somevalue) { this.somevalue = somevalue; } public List<Field> getFields() { return fields; } public void setFields(List<Field> fields) { this.fields = fields; } public void afterUnmarshal(Unmarshaller unmarshaller, Object parent) { for(Field field : fields) { if("somevalue".equals(field.getName())) { somevalue = Boolean.valueOf(field.getValue()); fields.remove(field); } } }}领域
public class Field { private String name; private String value; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getValue() { return value; } public void setValue(String value) { this.value = value; }}SomevalueAdapter
import javax.xml.bind.annotation.adapters.XmlAdapter;public class SomevalueAdapter extends XmlAdapter<AdaptedField, Boolean> { @Override public Boolean unmarshal(AdaptedField v) throws Exception { String value = v.getField().getValue(); return Boolean.valueOf(value); } @Override public AdaptedField marshal(Boolean v) throws Exception { AdaptedField adaptedField = new AdaptedField(); Field field = new Field(); field.setName("somevalue"); field.setValue(String.valueOf(v)); adaptedField.setField(field); return adaptedField; }}字段适配器
import javax.xml.bind.annotation.adapters.XmlAdapter;public class FieldsAdapter extends XmlAdapter<AdaptedField, Field> { @Override public Field unmarshal(AdaptedField v) throws Exception { return v.getField(); } @Override public AdaptedField marshal(Field v) throws Exception { AdaptedField adaptedField = new AdaptedField(); adaptedField.setField(v); return adaptedField; }}AdaptedField
public class AdaptedField { private Field field; public Field getField() { return field; } public void setField(Field field) { this.field = field; }}演示版
导入java.io.File;
import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Test.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); Test test = (Test) unmarshaller.unmarshal(new File("input.xml")); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(test, System.out); }}input.xml
<?xml version="1.0" encoding="UTF-8"?><test> <fields> <field> <name>somevalue</name> <value>true</value> </field> </fields> <fields> <field> <name>otherValue</name> <value>1</value> </field> </fields> <fields> <field> <name>anotherValue</name> <value>2</value> </field> </fields></test>



