一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JAXB命名空間_動力節點Java學院整理

JAXB命名空間_動力節點Java學院整理

2020-12-19 14:49lzrabbit Java教程

這篇文章主要為大家詳細介紹了JAXB命名空間的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本篇介紹下JAXB進階使用,命名空間處理

使用package-info.java添加默認命名空間

在需要添加命名空間的包下面添加package-info.java文件,然后添加@XmlSchema注解,這樣整個包序列化時就都會自動加上命名空間了

?
1
2
3
4
@XmlSchema(namespace = "http://www.lzrabbit.cn")
package com.bjpowernode.test;
 
import javax.xml.bind.annotation.XmlSchema;

命名空間前綴處理

相信大名鼎鼎的ns2,nsXX讓很多人非常頭疼類似下面這樣的

?
1
2
3
4
5
6
7
8
9
<?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注解并設置屬性xmlns

?
1
2
3
4
5
@XmlSchema( xmlns = { @XmlNs(namespaceURI = "http://www.lzrabbit.cn", prefix = "rabbit"), @XmlNs(namespaceURI = "http://www.cnblogs.com", prefix = "blog")})
 
package com.bjpowernode.test;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlNs;

ClassA如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Package com.bjpowernode.test;
 
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;
  }
}

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

?
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rabbit:classA xmlns:rabbit="http://www.lzrabbit.cn" xmlns:blog="http://www.cnblogs.com">
  <classAId>11</classAId>
  <ClassAName>A1</ClassAName>
  <classB>
    <ClassBId>22</ClassBId>
    <ClassBName>B2</ClassBName>
  </classB>
</rabbit:classA>

注意事項

1.若jdk版本為1.6的需要需要添加jaxb-core-2.2.7.jar和jaxb-impl-2.2.7.jar兩個包的引用,否則即便設置了package-info的XmlSchema注解的xmlns注釋也不能生效,若為jdk 1.7的無需添加

2.使用XmlSchema定義的前綴會對整個包生效,無法實現對每個實體類的單獨前綴定義,很不靈活,故此不推薦使用此方式

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

?
1
2
3
4
5
6
7
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;
        }
      });

如上所示,在序列化時判斷namespaceUri也就是我們定義的命名空間,然后返回我們自定義的前綴,其中的suggestion參數就是默認的前綴,有興趣的話打印下就會發現suggestion就是ns2之類的前綴,把要自定義前綴的命名空間都在這里判斷下就可以完全控制自定義前綴了,相對方法一來說可以實現對每個實體類的命名空間前綴控制,采用方法二后的序列化結果:

?
1
2
3
4
5
6
7
8
9
<?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>

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.bjpowernode.test;
 
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.cnblogs.com")) 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());
    }
  }
}

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

下一篇繼續深入,Java XML操作之JAXB玩轉命名空間 

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

?
1
2
3
4
5
6
7
8
9
10
11
<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>

也可以自行去官網下載 https://jaxb.java.net/

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日产免费自线一二区 | 四虎影院永久在线 | 校园全黄h全肉细节文 | 高清在线观看mv的网址免费 | 丫鬟粗大狠狠贯穿h | 亚洲 欧美 国产 综合首页 | 日本暖暖视频在线观看 | 黑人巨大初黑人解禁作品 | 精品在线一区 | 日韩精品一区二区三区视频 | 四虎1515hhcom | 亚洲欧美日韩高清 | 亚洲福利天堂 | 欧美贵妇videos办公室 | 美女脱一光二净的视频 | 日本道色综合久久影院 | 奇米久草 | 午夜国产视频 | 好男人资源在线观看免费的 | 丝袜捆绑调教视频免费区 | 9966久久精品免费看国产 | 视频高清在线观看 | 福利视频一区二区牛牛 | 5g影院天天爽爽 | 青视频在线 | 欧美在线播放成人免费 | 色老板最新网站视频地址 | 人成午夜免费大片在线观看 | 91gmail国产| 嫩草影院永久在线播放 | 免看一级一片一在线看 | 亚洲swag精品自拍一区 | 性猛交娇小69hd | 亚洲2卡三卡4卡5卡精品 | 日韩在线免费 | 暖暖在线日本 | 日本红怡院亚洲红怡院最新 | 亚洲网站在线 | 小舞同人18av黄漫网站 | 91制片厂制作果冻传媒破解 | 亚洲激情自拍偷拍 |