【问题标题】:JAXB Java generating XML, Why lowercase?JAXB Java 生成 XML,为什么要小写?
【发布时间】:2012-04-10 09:18:36
【问题描述】:

当我运行这段代码时:

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;
  }
}

我明白了

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
    <code>CA</code>
    <name>Cath</name>
    <salary>300</salary>
</employee>

哪个是正确的,所以我的问题是为什么它将员工更改为员工? 是否可以用大写 E 代替员工打印?

这是我真正想要的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Employee>
    <code>CA</code>
    <name>Cath</name>
    <salary>300</salary>
</Employee>

谢谢!

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

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

    你可以使用@XmlRootElement注解来指定一个名字:

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

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

    【讨论】:

    • 或者,如果您使用的是 jaxb-bindings.xml 和 jaxb2-annotate-plugin 那么 ......
    【解决方案2】:

    对于特定元素...

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

    对于对象....

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

    【讨论】:

    • 奇怪的是,这样做会在 xml 中给我相同的元素 2 次。一次小写,一次大写
    • 我知道这是一个旧线程,但我认为值得回答的是,您需要使用 @XmlAccessorType(XmlAccessType.FIELD) 注释您的类以避免重复您的元素。
    【解决方案3】:

    将@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<String, Object[]> 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<String, Object[]> 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<String, Object[]> aliasStart = new TreeMap<String, Object[]>();
        /* */
        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<String, Object[]> aliaslist = getListAlias(c);
                for (String key : aliaslist.keySet()) {
                    Object[] aliasvalue = new Object[3];
                    aliasvalue = aliaslist.get(key);
                    aliasStart.put(key, aliasvalue);
                }
            }
    
        }
        return aliasStart;
    }
    }
    

    【讨论】:

      【解决方案4】:

      另一个答案,如果 JAXB 不是必须的,那么您实际上可以使用 org.json jar 将对象转换为 JSONObject,然后从那里,您可以使用 XML 对象将 JSONObject 转换为 XML。您需要进行一些调整才能成为独立的 XML。

      一个代码sn-p示例:

      public static String getXMLString(Object o){
          JSONObject json = new JSONObject(o);
          String result = 
              "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + 
              XML.toString(json, o.getClass().getSimpleName());
          return result;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-14
        • 2021-08-23
        • 1970-01-01
        • 2018-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多