<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      JAXB命名空間及命名空間前綴處理

      本篇介紹下JAXB進(jìn)階使用,命名空間處理

      • 使用package-info.java添加默認(rèn)命名空間
        在需要添加命名空間的包下面添加package-info.java文件,然后添加@XmlSchema注解,這樣整個(gè)包序列化時(shí)就都會(huì)自動(dòng)加上命名空間了
        @XmlSchema(namespace = "http://www.lzrabbit.cn")
        package cn.lzrabbit;
        
        import javax.xml.bind.annotation.XmlSchema;

         

      • 命名空間前綴處理
        相信大名鼎鼎的ns2,nsXX讓很多人非常頭疼類似下面這樣的
        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ns2:classA xmlns:ns2="http://www.lzrabbit.cn">
            <classAId>11</classAId>
            <ClassAName>A1</ClassAName>
            <classB>
                <ClassBId>22</ClassBId>
                <ClassBName>B2</ClassBName>
            </classB>
        </ns2:classA>

        解決方法一(不推薦):
        添加package-info.java添加@XmlSchema注解并設(shè)置屬性xmlns

        @XmlSchema( xmlns = { @XmlNs(namespaceURI = "http://www.lzrabbit.cn", prefix = "rabbit"), @XmlNs(namespaceURI = "http://www.rzrgm.cn", prefix = "blog")})
        
        package cn.lzrabbit;
        import javax.xml.bind.annotation.XmlSchema;
        import javax.xml.bind.annotation.XmlNs;

        ClassA如下

        package cn.lzrabbit;
        
        import javax.xml.bind.annotation.*;
        
        @XmlRootElement(namespace="http://www.lzrabbit.cn")
        @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;
            }
        }
        View Code

         

        序列化結(jié)果如下,可以看到已經(jīng)按照我們所預(yù)期的修改了命名空間前綴,這里要注意下需要自定義前綴的實(shí)體類添加的@XmlRootElement(namespace="http://www.lzrabbit.cn")注解時(shí)指定的namespace必須和package-info.java定義的前綴一致,否則還是會(huì)生成nsXX這樣的前綴

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

        注意事項(xiàng)
        1.若jdk版本為1.6的需要需要添加jaxb-core-2.2.7.jar和jaxb-impl-2.2.7.jar兩個(gè)包的引用,否則即便設(shè)置了package-info的XmlSchema注解的xmlns注釋也不能生效,若為jdk 1.7的無(wú)需添加
        2.使用XmlSchema定義的前綴會(huì)對(duì)整個(gè)包生效,無(wú)法實(shí)現(xiàn)對(duì)每個(gè)實(shí)體類的單獨(dú)前綴定義,很不靈活,故此不推薦使用此方式

        解決方法二(推薦):
        同方法一若jdk版本為1.6需要添加jaxb-core-2.2.7.jar和jaxb-impl-2.2.7.jar兩個(gè)包的引用,不過(guò)方法二不需要添加package-info當(dāng)然也就不需要定義XmlSchema
        思路就是實(shí)現(xiàn)NamespacePrefixMapper抽象類,并重寫getPreferredPrefix方法,看到方法名應(yīng)該都明白了,對(duì)就是在序列化的時(shí)候重寫獲取命名空間前綴方法,為了簡(jiǎn)潔這里使用類匿名內(nèi)部類實(shí)現(xiàn)的

        marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() {
                        @Override
                        public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
                            if (namespaceUri.equals("http://www.lzrabbit.cn")) return "abc";
        return suggestion; } });

        如上所示,在序列化時(shí)判斷namespaceUri也就是我們定義的命名空間,然后返回我們自定義的前綴,其中的suggestion參數(shù)就是默認(rèn)的前綴,有興趣的話打印下就會(huì)發(fā)現(xiàn)suggestion就是ns2之類的前綴,把要自定義前綴的命名空間都在這里判斷下就可以完全控制自定義前綴了,相對(duì)方法一來(lái)說(shuō)可以實(shí)現(xiàn)對(duì)每個(gè)實(shí)體類的命名空間前綴控制,采用方法二后的序列化結(jié)果:

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

        采用方法二后的序列化方法

        package cn.lzrabbit;
        
        import java.io.StringReader;
        import java.io.StringWriter;
        
        import javax.xml.bind.*;
        
        import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
        import com.sun.xml.bind.v2.WellKnownNamespace;
        
        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頭聲明信息
        
                    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() {
                        @Override
                        public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
                            if (namespaceUri.equals("http://www.lzrabbit.cn")) return "abc";
                            if (namespaceUri.contains("http://www.rzrgm.cn")) return "blog";
                            return suggestion;
                        }
                    });
        
                    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());
                }
            }
        }
        View Code

         

      現(xiàn)在我們基本解決了jaxb序列化xml的命名空間及前綴問(wèn)題,但還是有很多問(wèn)題,比如序列化和反序列化時(shí)如何忽略命名空間,如何使用@XmlRootElement控制每個(gè)實(shí)體類的默認(rèn)命名空間也就是消除命名空間前綴

      下一篇繼續(xù)深入,Java XML操作之JAXB玩轉(zhuǎn)命名空間 

      最后給下jaxb-core-2.2.7.jar和jaxb-impl-2.2.7.jar兩個(gè)包的maven引用

      <dependency>
          <groupId>com.sun.xml.bind</groupId>
          <artifactId>jaxb-core</artifactId>
          <version>2.2.7</version>
      </dependency>
      
      <dependency>
          <groupId>com.sun.xml.bind</groupId>
          <artifactId>jaxb-impl</artifactId>
          <version>2.2.7</version>
      </dependency>

      也可以自行去官網(wǎng)下載 https://jaxb.java.net/

       

      posted @ 2014-04-20 10:56  懶惰的肥兔  閱讀(25448)  評(píng)論(2)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产偷国产偷亚洲高清日韩| 在线高清免费不卡全码| 欧美亚洲综合久久偷偷人人 | 欧美丰满熟妇bbbbbb| 亚洲精品av一二三区无码| 成av免费大片黄在线观看| 国产熟女激情一区二区三区| 日本成熟少妇喷浆视频| 亚洲男女羞羞无遮挡久久丫| 亚洲AV无码秘?蜜桃蘑菇| 免费人成视频x8x8国产| 无码精品人妻一区二区三区中| 精品国产乱码久久久久久浪潮| 一区二区中文字幕av| 人妻少妇精品系列| 日韩中文字幕av有码| 亚洲日韩一区精品射精| 久久综合色最新久久综合色| 国产精品一区在线免费看| 毛片网站在线观看| 天天躁夜夜躁狠狠喷水| 国产精品一区二区传媒蜜臀| 亚洲精品无码高潮喷水A| 亚洲午夜精品久久久久久抢| 国产一区二区三区国产视频| 在线 欧美 中文 亚洲 精品| 日韩精品中文字一区二区| 国产自产视频一区二区三区| 91超碰在线精品| 啊灬啊灬啊灬快灬高潮了电影片段| 精品国产一区二区色老头| 91区国产福利在线观看午夜| 日韩av日韩av在线| 天堂av网一区二区三区| 亚洲男女羞羞无遮挡久久丫| 亚洲欧美中文字幕日韩一区二区| 国产中文字幕久久黄色片| 欧美性xxxxx极品| 国产一区二区三区美女| 日本五十路熟女一区二区| 免费国产又色又爽又黄的网站|