JAXB命名空間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本篇介紹下JAXB進(jìn)階使用,命名空間處理
使用package-info.java添加默認(rèn)命名空間
在需要添加命名空間的包下面添加package-info.java文件,然后添加@XmlSchema注解,這樣整個(gè)包序列化時(shí)就都會(huì)自動(dòng)加上命名空間了
@XmlSchema(namespace = "http://www.lzrabbit.cn") package com.bjpowernode.test; 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.cnblogs.com", prefix = "blog")})
package com.bjpowernode.test;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlNs;
ClassA如下
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;
}
}
序列化結(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.cnblogs.com">
<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 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());
}
}
}
現(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/
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud中的openFeign調(diào)用服務(wù)并傳參的過(guò)程
服務(wù)和服務(wù)之間通信,不僅僅是調(diào)用,往往在調(diào)用過(guò)程中還伴隨著參數(shù)傳遞,接下來(lái)重點(diǎn)來(lái)看看OpenFeign在調(diào)用服務(wù)時(shí)如何傳遞參數(shù),感興趣的朋友一起看看吧2023-11-11
Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼
本文主要介紹了Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
java如何用Processing生成馬賽克風(fēng)格的圖像
這篇文章主要介紹了如何用java如何用Processing生成馬賽克風(fēng)格的圖像,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Java CGLib動(dòng)態(tài)代理機(jī)制(全面解析)
下面小編就為大家?guī)?lái)一篇Java CGLib動(dòng)態(tài)代理機(jī)制(全面解析)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
java Struts2框架下實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了java Struts2框架下實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Java中如何將json字符串轉(zhuǎn)換成map/list
這篇文章主要介紹了Java中如何將json字符串轉(zhuǎn)換成map/list,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

