jaxb 里如何jaxb 去掉元素 xsi命名空间

博客访问: 6701
博文数量: 1
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Linux
最近项目中用到了JAXB以及Websphere Business Events,偶然从一个Defect中发现了这个问题,记录一下。JavaBean中既包含简单类型属性,也包含复杂类型属性,如下面的Sample C@XmlRootElement(name = "SampleRootBean", namespace =
)public class SampleRootBean&{&&& ....&&& @XmlElement(namespace = "")&&& private String ID;//简单类型&&& @XmlElement(namespace = "")&&& private String N//简单类型&&& @XmlElement(namespace = "")&&& private SampeChildBean[] SampleChileB//复杂类型其通过JAXB的Marshaller序列化出的XML如下所示:
<SampleRootBean xmlns=" " xmlns:ns2=/samplechildben&&&xmlns:ns3=
其中的命名空间按照父到子的关系以此递增排列,如xmlns,xmlns:ns2,xmlns:ns3...JaveBean中只包含复杂类型属性,如下面的Sample C@XmlRootElement(name = "SampleRootBean", namespace = " ")public class SampRootBean{&&& ...&&& @XmlElement(namespace = "")&&& private SampleChild1 C1;&&& @XmlElement(namespace = "")&&& private SampleChild2 C2;这时起通过JAXB的Marshaller序列化出的XML如下所示:
这时的命名空间尽然反其道行之,从ns2到xmlns,再到xmlns:ns3,乍一看,还以为是定义有错,但是确实一个符合规范的XML,只是格式上很为怪异,不知道JAXB为何会做如此处理,改天研究下其API再接着探讨~~
阅读(2858) | 评论(0) | 转发(0) |
上一篇:没有了
下一篇:没有了
相关热门文章
给主人留下些什么吧!~~
JAXB处理简单对象、复杂对象中Namespace的异同这篇文章已被推荐到圈子中。
请登录后评论。通过JAXB请求和解析WebService - 推酷
通过JAXB请求和解析WebService
的getWeatherbyCityName SOAP1.2为例
需要两个对象:
请求对象(GetWeatherbyCityName)
响应对象(GetWeatherbyCityNameResponse)
package jaxb.
import javax.xml.bind.annotation.XmlE
import javax.xml.bind.annotation.XmlRootE
@XmlRootElement
public class GetWeatherbyCityName {
@XmlElement
private String theCityN
private GetWeatherbyCityName() {
public static GetWeatherbyCityName create() {
return new GetWeatherbyCityName();
public GetWeatherbyCityName theCityName(String theCityName) {
this.theCityName = theCityN
package jaxb.
import java.util.ArrayL
import java.util.L
import javax.xml.bind.annotation.XmlE
import javax.xml.bind.annotation.XmlElementW
import javax.xml.bind.annotation.XmlRootE
@XmlRootElement
public class GetWeatherbyCityNameResponse {
@XmlElementWrapper(name = &getWeatherbyCityNameResult&)
@XmlElement(name = &string&)
private List&String& strings = new ArrayList&String&();
public List&String& getStrings() {
package-info.java 不能少,给请求对象GetWeatherbyCityName加上命名空间的,修改前缀
@javax.xml.bind.annotation.XmlSchema(
namespace = &.cn/&,
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
package jaxb.
请求WebService并解析为GetWeatherbyCityNameResponse对象
import java.io.InputS
import java.io.OutputS
import java.net.HttpURLC
import java.net.URI;
import java.net.URL;
import javax.xml.bind.JAXBC
import javax.xml.bind.JAXBE
import javax.xml.bind.M
import javax.xml.bind.U
import javax.xml.parsers.DocumentBuilderF
import javax.xml.soap.MessageF
import javax.xml.soap.SOAPB
import javax.xml.soap.SOAPC
import javax.xml.soap.SOAPE
import javax.xml.soap.SOAPM
import jaxb.soap.GetWeatherbyCityNameR
import jaxb.soap.GetWeatherbyCityN
import org.w3c.dom.D
public class JaxbTest {
private static String uri = &.cn/WebServices/WeatherWebService.asmx&;
public static void main(String[] args) throws Exception {
URL url = URI.create(uri).toURL();
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod(&POST&);
connection.setRequestProperty(&Content-Type&, &application/soap+ charset=utf-8&);
// 发送数据
OutputStream outputStream = connection.getOutputStream();
Document requestDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Marshaller marshaller = JAXBContext.newInstance(GetWeatherbyCityName.class).createMarshaller();
marshaller.marshal(GetWeatherbyCityName.create().theCityName(&南京&), requestDocument);
SOAPMessage requestSOAPMessage = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage();
SOAPBody soapBody = requestSOAPMessage.getSOAPBody();
soapBody.addDocument(requestDocument);
SOAPEnvelope soapEnvelope = requestSOAPMessage.getSOAPPart().getEnvelope();
soapEnvelope.removeNamespaceDeclaration(&env&);
soapEnvelope.addNamespaceDeclaration(&soap12&, &http://www.w3.org/2003/05/soap-envelope&);
soapEnvelope.addNamespaceDeclaration(&xsi&, &http://www.w3.org/2001/XMLSchema-instance&);
soapEnvelope.addNamespaceDeclaration(&xsd&, &http://www.w3.org/2001/XMLSchema&);
soapEnvelope.setPrefix(&soap12&);
soapEnvelope.removeChild(soapEnvelope.getHeader());
soapBody.setPrefix(&soap12&);
requestSOAPMessage.writeTo(outputStream);
// 接收数据
InputStream inputStream = connection.getInputStream();
SOAPMessage responseSOAPMessage = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage(null, inputStream);
responseSOAPMessage.writeTo(System.out);
Unmarshaller unmarshaller = JAXBContext.newInstance(GetWeatherbyCityNameResponse.class).createUnmarshaller();
JAXBElement&GetWeatherbyCityNameResponse& jaxbElement = unmarshaller.unmarshal(responseSOAPMessage.getSOAPBody().extractContentAsDocument(), GetWeatherbyCityNameResponse.class);
GetWeatherbyCityNameResponse response = jaxbElement.getValue();
System.out.println(response.getStrings());
outputStream.close();
inputStream.close();
connection.disconnect();
输出结果:
[江苏, 南京, 5.jpg,
14:55:22, 25℃/31℃, 7月26日 多云转雷阵雨, 西风3-4级转东北风3-4级, 1.gif, 4.gif, 今日天气实况:气温:23℃;风向/风力:东北风 2级;湿度:98%;空气质量:暂无;紫外线强度:中等, 穿衣指数:热,适合穿T恤、短薄外套等夏季服装。
过敏指数:暂无。
运动指数:较适宜,请适当降低运动强度并注意户外防风。
洗车指数:较不宜,风力较大,洗车后会蒙上灰尘。
晾晒指数:适宜,天气不错,抓紧时机让衣物晒太阳吧。
旅游指数:暂无。
路况指数:干燥,天气较好,路面较干燥,路况较好。
舒适度指数:较不舒适,多云,有些热。
空气污染指数:暂无。
紫外线指数:中等,涂擦SPF大于15、PA+防晒护肤品。, 25℃/30℃, 7月27日 雷阵雨, 东南风3-4级, 4.gif, 4.gif, 25℃/31℃, 7月28日 雷阵雨转阴, 东南风3-4级, 4.gif, 2.gif, 南京简称“宁”,别名“金陵”,也曾称建业、建康、石头城等,现为江苏省省会,是长江下游西部的中心城市。它位于江苏省西部,东依宁镇山脉,地势险固,风景秀丽。诸葛亮曾对南京一带的山川形势评价说:“钟阜龙蟠,石城虎踞”。南京属北亚热带季风气候区,四季分明,年度最佳气节为秋季(9-11月)。南京是历经苍桑的十代都会。三国鼎立,她目睹群雄角逐争战;六代兴替,她阅尽王朝的曲终幕落;明初,她以举世无双的巍巍城垣显示了泱泱大国之风;晚清,她为近代中国第一个不平等条约被冠上自己的名字而蒙受辱;太平天国,历史在这里风雷激荡;辛亥革命,潮流在这里奔突迂回;抗日战争,日军在这里留下人类历史上最野蛮、最血腥的一页。景观:南京秦淮河,中山陵,玄武湖,莫愁湖,雨花台景区,明孝陵,栖霞山,南京长江大桥。南京是中国的历史文化名城之一,文化古迹比较集中,有新石器时代古文化遗址多处,有三国东吴所筑石头城遗址、南京帝王的陵墓、明代朱元璋的陵墓(明孝陵等)。名胜游览地也很多,主要有中山陵、玄武湖、灵谷寺、秦淮河和栖霞山等。革命纪念地有梅园新村、雨花台等。钟山风景区为国家第一批国家重点风景名胜区,位于南京东北郊,以钟山和玄武湖为中心,是来南京旅游的旅游者的必游之地。这一带主要景观包括中山陵、明孝陵、孙权墓和灵谷寺等。南京山、水、城、林相映成趣,景色壮丽秀美,是中国著名的风景旅游城市。]
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致博客访问: 317286
博文数量: 141
博客积分: 3568
博客等级: 中校
技术积分: 1932
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Java
1. 先下载 JAXB-RI, 确保 jaxb-impl-x.x.x.jar 位于你的classpath下,且优先于JDK的RT.jar2. 参考使用以下代码:import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.stream.XMLStreamException;
import javax.xml.transform.TransformerException;
import me.test.persons.Person;
import me.test.persons.Persons;
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
public class CustomJAXBPrefix {
&&&&public static void main(String[] args) throws Exception {
&&&&&&&&marshal();&&& }
&&&&public static void marshal() throws JAXBException, XMLStreamException,
&&&&&&&&&&&&FileNotFoundException, TransformerException {
&&&&&&&&// Step 1.
&&&&&&&&Persons ps = new Persons();
&&&&&&&&Person p = new Person();
&&&&&&&&p.setAge(12);
&&&&&&&&p.setName("btpka3");
&&&&&&&&p.set***("man");
&&&&&&&&ps.getPerson().add(p);
&&&&&&&&JAXBContext context = JAXBContext.newInstance(Persons.class);
&&&&&&&&Marshaller marshaller = context.createMarshaller();
&&&&&&&&marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
&&&&&&&&marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
&&&&&&&&marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);
&&&&&&&&marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
&&&&&&&&&&&&&&&&new MyNamespacePrefixMapper());
&&&&&&&&marshaller.marshal(ps, System.out);
&&&&&&&&System.out.println();
&&&&public static class MyNamespacePrefixMapper extends NamespacePrefixMapper {
&&&&&&&&@Override
&&&&&&&&public String getPreferredPrefix(String namespaceUri,
&&&&&&&&&&&&&&&&String suggestion, boolean requirePrefix) {
&&&&&&&&&&&&if (requirePrefix) {
&&&&&&&&&&&&&&&&if ("http://test.me/persons".equals(namespaceUri)) {
&&&&&&&&&&&&&&&&&&&&return "me";
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&return suggestion;
&&&&&&&&&&&&} else {
&&&&&&&&&&&&&&&&return "";
&&&&&&&&&&&&}
阅读(1159) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。jaxb的解析问题,w3c有命名空间和没有命名空间的情况 - 开源中国社区
当前访客身份:游客 [
当前位置:
&xsd:schema targetNamespace=&http://xbrl./taxonomy//cas& attributeFormDefault=&unqualified& elementFormDefault=&qualified& xmlns:xsd=&http://www.w3.org/2001/XMLSchema& &
& &xsd:import namespace=&http://xbrl.iasb.org/taxonomy//ifrs& schemaLocation=&http://xbrl.iasb.org/taxonomy//ifrs-cor_.xsd&/&&/xsd:schema&
像这也的代码解析的时候解析不了,如果没有w3c命名空间程序解析没有问题,w3c有命名空间原来的程序就会出现问题,求大师解答啊
共有0个答案
更多开发者职位上
有什么技术问题吗?
那时花开的其它问题
类似的话题JAXB 序列化 java.util.Map - 为程序员服务
为程序员服务
JAXB 序列化 java.util.Map
使用JAXB序列化java.util.Map接口可能会遇到一些问题,本文通过几种方式来做map的序列化,包括不做任何处理的序列化、修改节点名称、添加xml命名空间、使用XmlAdapter统一命名空间。
首先介绍下序列化涉及到的几个类:
Customer类包含一个Map的属性,Map的key类型是String类型,而value类型是我们自定义的POJO类型。其代码如下:
package cn.outofmemory.
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Customer {
& & private Map&String, Address& addressMap = new HashMap&String, Address&();
& & public Map&String, Address& getAddressMap() {
& & & & return addressM
& & public void setAddressMap(Map&String, Address& addressMap) {
& & & & this.addressMap = addressM
Adress类是一个纯POJO类,定义如下
package cn.outofmemory.
public class Address {
& & private S
& & public String getStreet() {
& & public void setStreet(String street) {
& & & & this.street =
序列化入口类,此类初始化了Customer对象,并将此对象的jaxb序列化结果,输出到System.out流中,代码如下:
package cn.outofmemory.
import javax.xml.bind.*;
public class Demo {
& & public static void main(String[] args) throws Exception {
& & & & JAXBContext jc = JAXBContext.newInstance(Customer.class);
& & & & Address billingAddress = new Address();
& & & & billingAddress.setStreet("1 A Street");
& & & & Address shippingAddress = new Address();
& & & & shippingAddress.setStreet("2 B Road");
& & & & Customer customer = new Customer();
& & & & customer.getAddressMap().put("billing", billingAddress);
& & & & customer.getAddressMap().put("shipping", shippingAddress);
& & & & Marshaller marshaller = jc.createMarshaller();
& & & & marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
& & & & marshaller.marshal(customer, System.out);
默认的jaxb序列化&
下面我们看下不做任何设置的默认序列化结果:
&?xml version="1.0" encoding="UTF-8" standalone="yes"?& &customer&
&addressMap&
&key&shipping&/key&
&street&2 B Road&/street&
&key&billing&/key&
&street&1 A Street&/street&
&/addressMap& &/customer&
可以看到默认情况下map被序列化成一个一个的entry节点,每个entry节点都有key和value子节点。
修改map属性的节点名称
下面我们修改下addressMap节点的名字,需要使用&@XmlElementWrapper&注解,这个注解应该添加到getAddressMap方法上,如下修改后的Csutomer getAdressMap方法的代码:
& & @XmlElementWrapper(name = "addresses")
& & public Map&String, Address& getAddressMap() {
& & & & return addressM
这样修改之后的输出如下:
&?xml version="1.0" encoding="UTF-8" standalone="yes"?& &customer&
&addresses&
&key&shipping&/key&
&street&2 B Road&/street&
&key&billing&/key&
&street&1 A Street&/street&
&/addresses& &/customer&
jaxb添加xml命名空间
下面我们再看下如何使用JAXB控制xml的namespace,我们需要在package-info.java文件中给package添加如下注解:
@XmlSchema(
namespace="",
elementFormDefault=XmlNsForm.QUALIFIED)
package cn.outofmemory.
import javax.xml.bind.annotation.*;
XmlSchema注解指定了包中jaxb序列化的命名空间。
我们可以再运行下Demo看下添加命名空间之后的输出:
&?xml version="1.0" encoding="UTF-8" standalone="yes"?& &ns2:customer xmlns:ns2=""&
&ns2:addresses&
&key&shipping&/key&
&ns2:street&2 B Road&/ns2:street&
&key&billing&/key&
&ns2:street&1 A Street&/ns2:street&
&/ns2:addresses& &/ns2:customer&
从上面的输出可以看到Customer类和Adress类的节点和属性节点都添加了ns2的命名空间限定,而Map类相关的都没有添加命名空间限定,这是因为Map属于java.util包,这个包中没有命名空间限定的注解修饰。
使用XmlAdapter统一jaxb序列化后的xml命名空间
下面我们通过XmlAdapter类实现统一的命名空间限定。
使用XmlAdapter可以转换指定属性的jaxb序列化方式,我们自定义的XmlAdapter属于我们自己所创建的包,而在这个包上是有命名空间注解修饰的。
package cn.outofmemory.
import java.util.*;
import javax.xml.bind.annotation.adapters.XmlA
public class MapAdapter extends XmlAdapter&MapAdapter.AdaptedMap, Map&String, Address&& {
& & public static class AdaptedMap {
& & & & public List&Entry& entry = new ArrayList&Entry&();
& & public static class Entry {
& & & & public S
& & & & public A
& & @Override
& & public Map&String, Address& unmarshal(AdaptedMap adaptedMap) throws Exception {
& & & & Map&String, Address& map = new HashMap&String, Address&();
& & & & for(Entry entry : adaptedMap.entry) {
& & & & & & map.put(entry.key, entry.value);
& & @Override
& & public AdaptedMap marshal(Map&String, Address& map) throws Exception {
& & & & AdaptedMap adaptedMap = new AdaptedMap();
& & & & for(Map.Entry&String, Address& mapEntry : map.entrySet()) {
& & & & & & Entry entry = new Entry();
& & & & & & entry.key = mapEntry.getKey();
& & & & & & entry.value = mapEntry.getValue();
& & & & & & adaptedMap.entry.add(entry);
& & & & return adaptedM
XmlAdapter是一个泛型的抽象类,我们需要自己实现marshal和unmarshal方法。在我们的自定义XmlAdapter中我们将Map的键值对转换成我们自定义的Entry类实例,而Entry类所在包是有命名空间注解修饰的。
然后需要将MapAdapter通过XmlJavaTypeAdapter注解添加到Customer的getAddressMap()方法上,如下代码示例:
@XmlJavaTypeAdapter(MapAdapter.class)
@XmlElement(name="addresses")
public Map&String, Address& getAddressMap() {
& & return addressM
这样序列化类型就都属于我们自己的包了,会有统一的命名空间,我们看下输出xml:
&?xml version="1.0" encoding="UTF-8" standalone="yes"?& &customer xmlns=""&
&addresses&
&key&shipping&/key&
&street&2 B Road&/street&
&key&billing&/key&
&street&1 A Street&/street&
&/addresses& &/customer&
可以看到最后输出的xml是统一到一个默认的命名空间中了。
推荐阅读:
相关聚客文章}

我要回帖

更多关于 jaxb 去掉xmlns xsi 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信