Remove xsi:type after marshalling abstract class with hierarchy 删除xml节点中的xsi:type xmlns:xsi

原创 2015年11月18日 16:35:34
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MbfService>
    <output1>
        <MbfHeader>
            <ServiceCode>LMPCustLevelMgmt</ServiceCode>
            <Operation>queryLevelInfo</Operation>
            <UId>414d5120514d5f6c6f63616c202020203baa474c20012802</UId>
            <ServiceResponse>
                <Status>COMPLETE</Status>
            </ServiceResponse>
        </MbfHeader>
        <MbfBody>
            <appHeader>
                <getRecNum>1</getRecNum>
                <beginRecNum>0</beginRecNum>
            </appHeader>
            <body xsi:type="tr01010010Res" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <custNum>6002058692</custNum>
                <levelTypeStructList>
                    <levelTypeStruct>
                        <levelType>A1000020</levelType>
                        <levelNum>B1000010</levelNum>
                    </levelTypeStruct>
                </levelTypeStructList>
            </body>
        </MbfBody>
    </output1>
</MbfService>

上面是使用JAXBContext解析出的报文,想把body节点中的xsi:type xmlns:xsi删除,google找出一篇文章,记录之:


Remove xsi:type after marshalling abstract class with hierarchy

If someone help me, that will be great. So I have a structure:

<span style="font-family:Courier New;font-size:12px;"><letters> 
  <list> 
    <name>Simon</name>  
    <type>2</type>  
    <passengerName>Johny</passengerName>  
    <passengerSurname>Revelator</passengerSurname> 
  </list>  
  <list> 
    <name>someName</name>  
    <type>4</type>  
    <fileURL>someUrl</fileURL>  
    <specialNotes>specialNotes</specialNotes> 
  </list> 
</letters></span>


For this structure I wrote Java Classes and they marshall and unmarshall it: Class A package com.edhex.testing;

import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlSeeAlso({B.class, C.class})
@XmlType
abstract public class A {
    int type;
    String name;

    @XmlElement
    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    @XmlElement
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Class Letters:

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Letters {
    List<A> list;

    @XmlElement
    public List<A> getList() {
        return list;
    }

    public void setList(List<A> list) {
        this.list = list;
    }
}

Class B:

@XmlRootElement
@XmlType
@XmlAccessorType(XmlAccessType.PROPERTY)
public class B extends A {
    String fileURL;
    String specialNotes;
    @XmlElement
    public String getFileURL() {
        return fileURL;
    }

    public void setFileURL(String fileURL) {
        this.fileURL = fileURL;
    }
    @XmlElement
    public String getSpecialNotes() {
        return specialNotes;
    }

    public void setSpecialNotes(String specialNotes) {
        this.specialNotes = specialNotes;
    }
}

Class C:

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)

public class C extends A {
    String passengerName;
    String passengerSurname;
    @XmlElement
    public String getPassengerName() {
        return passengerName;
    }

    public void setPassengerName(String passengerName) {
        this.passengerName = passengerName;
    }
    @XmlElement
    public String getPassengerSurname() {
        return passengerSurname;
    }

    public void setPassengerSurname(String passengerSurname) {
        this.passengerSurname = passengerSurname;
    }
}

Everything looks fine, but after marshalling which I do like this:

public static void main(String[] args) {
        C c = new C();
        c.setName("Simon");
        c.setType(2);
        c.setPassengerName("Johny");
        c.setPassengerSurname("Revelator");
        B b = new B();
        b.setType(4);
        b.setFileURL("someUrl");
        b.setSpecialNotes("specialNotes");
        b.setName("someName");

        List<A> list = new ArrayList<A>(2);
        list.add(c);
        list.add(b);
        Letters letter = new Letters();
        letter.setList(list);
        try {
            File file = new File("C:\file.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(Letters.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(letter, file);
            jaxbMarshaller.marshal(letter, System.out);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

I get output like this:

<letters>
    <list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="c">
        <name>Lasha</name>
        <type>2</type>
        <passengerName>Johny</passengerName>
        <passengerSurname>Revelator</passengerSurname>
    </list>
    <list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b">
        <name>someName</name>
        <type>4</type>
        <fileURL>someUrl</fileURL>
        <specialNotes>specialNotes</specialNotes>
    </list>
</letters>

Question: How can I remove those: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b" in each list tag? I know that JAXB will notify me with what type is it using, because originally mapping is using another type (A.class), but I don't need that information. Have somebody any ideas?


Answers



If you use @XmlElementRef on the list property then the element for the item will be based on the @XmlRootElement of the referenced class and then you won't get the xsi:type attibute.

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Letters {
    List<A> list;

    @XmlElementRef
    public List<A> getList() {
        return list;
    }

    public void setList(List<A> list) {
        this.list = list;
    }
}



用JDOM创建XML完整实例(包括定义xmlns:xsi和xsi:type)

在工作中发现jdom生成xml标签如 不能用冒号的问题root.setAttribute("xsi:type", "fb1")这是错误的。在网络搜索发现有很多人遇到了但是没有详细的解决方案。后来仔细看...
  • jian51868
  • jian51868
  • 2014年12月02日 10:06
  • 3489

JAXB的应用,及如何自定义namespace的prefix(前缀)

什么是JAXB? 不多解释,可以参见维基百科,亦或是百度百科。本文不会对基础部分进行讲解,因为我也没去细看,我只看了了他最简洁的应用方式(基于Annotaion),技术是项目服务,会用,能用好即可。本...
  • zl3450341
  • zl3450341
  • 2012年11月06日 21:52
  • 9957

JAXB例子

JAXB介绍 JAXB是Java Architecture for XML Binding的缩写。提供了一个快速便捷的方式将Java对象与XML进行转换。在JAX-WS(Java的WebServic...
  • binxigogo
  • binxigogo
  • 2012年08月16日 13:15
  • 8231

在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi

原文地址:在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi作者:VanHelsing 可使用以下代码: //Create our own namespaces for t...
  • fxhflower
  • fxhflower
  • 2012年02月20日 18:27
  • 10273

用jaxb方法将xml(带命名空间xmlns)转为java实体类

关于xml文件转为java实体类,如果不带命名空间 “ xml代码如下: ...
  • rdhj5566
  • rdhj5566
  • 2017年03月04日 19:55
  • 1047

Jaxb解析xml(带命名空间)相关联的属性 "xsi:NamespaceSchemaLocation" 的前缀 "xsi" 未绑定。

1. final JAXBContext context = JAXBContext.newInstance(XlvdDiagram.class); final Unmarshaller unm...
  • sidihuo
  • sidihuo
  • 2016年01月07日 18:41
  • 2934

html5 canvas java 上传

public class CanvasServlet extends HttpServlet { private static final long serialVersionUID = -6027...
  • lihuayingmail
  • lihuayingmail
  • 2014年04月13日 09:38
  • 1255

pom文件第一行报错<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSc

解决方法: 首先确定你的电脑是否可以连接网络。 如果可以连接网络,在maven的本地库的路径下执行以下命令: 打开cmd运行进入maven仓库如这是我的maven下载...
  • qq_28751105
  • qq_28751105
  • 2016年11月05日 13:34
  • 7481

JAXB格式化

JAXB格式化 2008-01-04 13:43 123人阅读 评论(0) 收藏 举报 JAXBContext jc = JAXBContext.newInstance(...
  • xjtuse_mal
  • xjtuse_mal
  • 2011年11月24日 02:08
  • 1011

SpringMVC 数据的格式化、JSR 303数据校验和国际化

1 数据的格式化User.javapublic class User { @DateTimeFormat(pattern="yyyy-MM-dd") private Date birth...
  • Peng_Hong_fu
  • Peng_Hong_fu
  • 2016年12月10日 18:28
  • 2329
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Remove xsi:type after marshalling abstract class with hierarchy 删除xml节点中的xsi:type xmlns:xsi
举报原因:
原因补充:

(最多只允许输入30个字)