最新公告
  • 欢迎您光临立业阁,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • java使用jaxb操作xml示例_xml教程


    首先定义两个示例类ClassA,ClassB,用于后续的示例演示

    package cn.lzrabbit;
    public class ClassA {
        private int classAId;
        private String classAName;
        private ClassB classB;
        public int getClassAId() {
            return classAId;
        }
        public void setClassAId(int classAId) {
            this.classAId = classAId;
        }
        public String getClassAName() {
            return classAName;
        }
        public void setClassAName(String classAName) {
            this.classAName = classAName;
        }
        public ClassB getClassB() {
            return classB;
        }
        public void setClassB(ClassB classB) {
            this.classB = classB;
        }
    }
    ClassA
    package cn.lzrabbit;
    public class ClassB {
        private int classBId;
        private String classBName;
        public int getClassBId() {
            return classBId;
        }
        public void setClassBId(int classBId) {
            this.classBId = classBId;
        }
        public String getClassBName() {
            return classBName;
        }
        public void setClassBName(String classBName) {
            this.classBName = classBName;
        }
    }
    ClassB

    用于序列化的XmlUtil

    package cn.lzrabbit;
    import java.io.StringReader;
    import java.io.StringWriter;
    import javax.xml.bind.*;
    public class XmlUtil {
        public static String toXML(Object obj) {
            try {
                JAXBContext context = JAXBContext.newInstance(obj.getClass());
                Marshaller marshaller = context.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// //编码格式
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
                marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xm头声明信息
                StringWriter writer = new StringWriter();
                marshaller.marshal(obj, writer);
                return writer.toString();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        @SuppressWarnings("unchecked")
        public static <T> T fromXML(String xml, Class<T> valueType) {
            try {
                JAXBContext context = JAXBContext.newInstance(valueType);
                Unmarshaller unmarshaller = context.createUnmarshaller();
                return (T) unmarshaller.unmarshal(new StringReader(xml));
            } catch (Exception e) {
                throw new RuntimeException(e.getMessage());
            }
        }
    }
    XmlUtil

    调用如下:

    package cn.lzrabbit;
    
    public class MainRun {
        /**
         * @param args
         */
        public static void main(String[] args) {
            ClassB classB = new ClassB();
            classB.setClassBId(22);
            classB.setClassBName("B2");
            ClassA classA = new ClassA();
            classA.setClassAId(11);
            classA.setClassAName("A1");
            classA.setClassB(classB);
            System.out.println(XmlUtil.toXML(classA));
        }
    }
    MainRun

    输出结果如下:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <classA>
        <classAId>11</classAId>
        <classAName>A1</classAName>
        <classB>
            <classBId>22</classBId>
            <classBName>B2</classBName>
        </classB>
    </classA>

    这里要注意以下几点

    1要序列化的类加上 @XmlRootElement注解,否则会报错(错误提示很清晰,这里就不贴出来了)

    2JAXB序列化XML时 默认序列化getter和setter,且getter和setter必须成对出现才会被序列化

    3属性名称,默认序列化出来的类和属性名称默认是首字母转换为小写,若需要控制属性名称需要在getter或setter上使用 @XmlElement(name="ClassAId") 指定名称,[email protected],但只能放一个,[email protected]

    4如何控制根节点名称?
    [email protected][email protected](name="ClassA")

    5怎么添加命名空间
    [email protected](namespace="cn.lzrabbit") 指定namespace属性

    6怎么精确控制每个属性名称
    JAXB自动转化为首字母小写会导致不可预料的属性名称出现, [email protected](name=""),想省事的话使用Field

    7怎么样实现序列化时使用Field字段而不是使用setter和getter
    [email protected](XmlAccessType.FIELD)注解,并指定为XmlAccessType.FIELD,[email protected](XmlAccessType.FIELD)注解,因为这样你可以精确的控制每个元素的名称,[email protected](name="")注解,[email protected]

    下面给出使用了使用如上注解后的代码示例

    @XmlRootElement(namespace="cn.lzrabbit")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class ClassA {
        private int classAId;
        
        @XmlElement(name="ClassAName")
        private String classAName;
        private ClassB classB;
        public int getClassAId() {
            return classAId;
        }
        public void setClassAId(int classAId) {
            this.classAId = classAId;
        }
        public String getClassAName() {
            return classAName;
        }
        public void setClassAName(String classAName) {
            this.classAName = classAName;
        }
        public ClassB getClassB() {
            return classB;
        }
        public void setClassB(ClassB classB) {
            this.classB = classB;
        }
    }
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class ClassB {
        private int ClassBId;
        private String ClassBName;
        public int getClassBId() {
            return ClassBId;
        }
        public void setClassBId(int classBId) {
            this.ClassBId = classBId;
        }
        public String getClassBName() {
            return ClassBName;
        }
        public void setClassBName(String classBName) {
            this.ClassBName = classBName;
        }
    }

    输出xml为

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ns2:classA xmlns:ns2="cn.lzrabbit">
        <classAId>11</classAId>
        <ClassAName>A1</ClassAName>
        <classB>
            <ClassBId>22</ClassBId>
            <ClassBName>B2</ClassBName>
        </classB>
    </ns2:classA>

    更多java使用jaxb操作xml示例相关文章请关注liyege!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    • 1196会员总数(位)
    • 111863资源总数(个)
    • 5本周发布(个)
    • 0 今日发布(个)
    • 249稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情
    冀ICP备19022365号-1 百度地图

    [email protected]

    立业阁(www.liyege.cn)免费提供wordpress主题模板、dedecms模板、帝国cms模板、小说网站源码、电影网站源码以及网络技术分享,建站源码,小说模板,电影模板,网赚教程,VPS推荐