JAXB Java生成XML,为什么小写?

当我运行此代码时:

import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; public class JavaToXMLDemo { public static void main(String[] args) throws Exception { JAXBContext context = JAXBContext.newInstance(Employee.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); Employee object = new Employee(); object.setCode("CA"); object.setName("Cath"); object.setSalary(300); m.marshal(object, System.out); } } @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) class Employee { private String code; private String name; private int salary; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSalary() { return salary; } public void setSalary(int population) { this.salary = population; } } 

我明白了

   CA Cath 300  

这是正确的,所以我的问题是为什么它将员工改为员工? 是否可以使用大写字母E而不是员工进行打印?

这就是我真正想要的:

   CA Cath 300  

谢谢!

您看到的行为是标准JAXB(JSR-222) XML名称到Java名称转换算法的结果。

您可以使用@XmlRootElement批注指定名称:

 @XmlRootElement(name="Employee") @XmlAccessorType(XmlAccessType.FIELD) class Employee { ... } 

我是EclipseLink JAXB(MOXy)的主管,我们有一个扩展,允许您覆盖您可能感兴趣的默认名称转换算法:

对于特定元素……

 @XmlElement( name = "Code") private String code; 

对象….

 @XmlRootElement(name="Employee") public class Employee{ ... 

将@XmlElement(name =“Xxxxx”)放入字段并使用XStream.aliasField()后的解决方案。 这更通用,因为它使用注释并在同一个包中扫描其他类调用。

 import java.lang.reflect.Field; import java.util.Map; import java.util.TreeMap; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlAttribute; import com.thoughtworks.xstream.XStream; import my.MyClassGeneratedFromXsdToJaxB; public class TestChangeFirstLetterXml { public static void main(String[] args) throws ClassNotFoundException { MyClassGeneratedFromXsdToJaxB myClassGeneratedFromXsdToJaxB=new MyClassGeneratedFromXsdToJaxB(); XStream xstream = new XStream(); xstream.autodetectAnnotations(true); xstream = makeAliasAnnotatedFields(xstream, MyClassGeneratedFromXsdToJaxB.class, "FirstTagOrRoot"); //System.out.println(xstream.toXML(myClassGeneratedFromXsdToJaxB)); } public static XStream makeAliasAnnotatedFields(XStream xstream, Class myclass, String firstTag) throws ClassNotFoundException { xstream.alias(firstTag, myclass); Map aliaslist = getListAlias(myclass); for (String key : aliaslist.keySet()) { Object[] aliasvalue = new Object[3]; aliasvalue = aliaslist.get(key); String xmlTag = new String((String) aliasvalue[0]); Class classJaxb = (Class) aliasvalue[1]; String tagToRename = new String((String) aliasvalue[2]); xstream.aliasField(xmlTag, classJaxb, tagToRename); System.out.println("AliasField " + xmlTag + " " + classJaxb.getName() + " " + tagToRename); } return xstream; } public static Map getListAlias(Class classToCheck) throws ClassNotFoundException { /* Read recursive fields of the class */ Field[] fs = classToCheck.getDeclaredFields(); String annotationsPackage = classToCheck.getPackage().getName(); String classSimpleName = new String(classToCheck.getSimpleName()); /* it is necessary avoid loop */ Map aliasStart = new TreeMap(); /* */ for (int i = 0; i < fs.length; i++) { String nameField = fs[i].getName(); String classFieldName = new String(fs[i].getType().getName()); String nameXmlXsd = new String(""); String idkey = new String(annotationsPackage + "."); if (fs[i].isAnnotationPresent(javax.xml.bind.annotation.XmlElement.class)) { XmlElement atrib = fs[i].getAnnotation(XmlElement.class); nameXmlXsd = new String(atrib.name()); idkey = new String(idkey + classSimpleName + ".Element." + nameField); } else if (fs[i].isAnnotationPresent(javax.xml.bind.annotation.XmlAttribute.class)) { XmlAttribute atrib = fs[i].getAnnotation(XmlAttribute.class); nameXmlXsd = new String(atrib.name()); idkey = new String(idkey + classSimpleName + ".Type." + nameField); } if (aliasStart.containsKey(idkey)) /* avoid loop */ continue; if (nameXmlXsd.equals("Signature")) // My particular condition continue; if (!nameXmlXsd.equals(classFieldName)) { // xstrem.aliasField(a,b,c) Object[] alias = new Object[3]; alias[0] = new String(nameXmlXsd); alias[1] = classToCheck; alias[2] = new String(nameField); aliasStart.put(idkey, alias); } if (classFieldName.indexOf(annotationsPackage) > -1) { Class c = Class.forName(classFieldName); Map aliaslist = getListAlias(c); for (String key : aliaslist.keySet()) { Object[] aliasvalue = new Object[3]; aliasvalue = aliaslist.get(key); aliasStart.put(key, aliasvalue); } } } return aliasStart; } }