您的位置:首页 > 其它

问题记录--通过jaxb转换的xml增加namespace信息

2013-11-22 15:15 399 查看

JAXB Object to XML与package-info.java

线上问题描述

通过 JABX将Object转换成XML,转化后的格式带namespace信息,此信息不是希望生成的,为什么会自动生成namespace信息呢?

过程分析

JABX 生成com.sun.xml.bind.v2.model.impl.TypeInfoImpl的QName parseElementName(ClassDeclT clazz)方法,会根据入口clazz的annotation生成两类信息

XmlRootElement:在clazz中定义的root信息
XmlSchema:同包中的注解信息,读取来自package-info.java文件

/**
* Parses an {@link XmlRootElement} annotation on a class
* and determine the element name.
*
* @return null
*      if none was found.
*/
protected final QName parseElementName(ClassDeclT clazz) {
// 获得对象上定义的注解
XmlRootElement e = reader().getClassAnnotation(XmlRootElement.class,clazz,this);
if(e==null)
return null;

String local = e.name();
if(local.equals("##default")) {
// if defaulted...
local = NameConverter.standard.toVariableName(nav().getClassShortName(clazz));
}
// 如果没有指定namespace,读取包注解
String nsUri = e.namespace();
if(nsUri.equals("##default")) {
// if defaulted ...
/* 包注解中读取XMLSchema,通过clazz(注:准备生成的对象)所在包目录中查找package-info.java
详见java.lang.Package类 getAnnotation(Class<A> annotationClass)方法
*/
XmlSchema xs = reader().getPackageAnnotation(XmlSchema.class,clazz,this);
if(xs!=null)
nsUri = xs.namespace();
else {
nsUri = builder.defaultNsUri;
}
}

return new QName(nsUri.intern(),local.intern());
}


结论

通过代码分拣得出以下结论

先读取XmlRootElement注解,可以定义name和namespace属性,如果name缺省为类名头字母下写
再读取包注解javax.xml.bind.annotation.XmlSchema,如果XmlRootElement注解的namespace为空,设置为包注解的namespace
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: