加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:15:55 所属栏目:百科 来源:网络整理
导读:JAXB Object to XML与package-info.java 线上问题描述 通过 JABX将Object转换成XML,转化后的格式带namespace信息,此信息不是希望生成的,为什么会自动生成namespace信息呢? 过程分析 JABX 生成com.sun.xml.bind.v2.model.impl.TypeInfoImpl的QName parseEleme

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,this);
            if(xs!=null)
                nsUri = xs.namespace();
            else {
                nsUri = builder.defaultNsUri;
            }
        }


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


结论

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

  1. 先读取XmlRootElement注解,可以定义name和namespace属性,如果name缺省为类名头字母下写
  2. 再读取包注解javax.xml.bind.annotation.XmlSchema,如果XmlRootElement注解的namespace为空,设置为包注解的namespace

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读