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;
    }
}



相关文章推荐

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

原文地址:在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi作者:VanHelsing 可使用以下代码: //Create our own namespaces for t...

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

关于xml文件转为java实体类,如果不带命名空间 “ xml代码如下: ...

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

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

XML之命名空间的作用(xmlns)

命名空间的作用,下面的内容是转载的,大家可以看看:   问题的出现:XML的元素名字是不固定的,当两个不同的文档使用同样的名称描述两个不同类型的元素的时候,或者一个同样的标记表示两个不同含...
  • zhch152
  • zhch152
  • 2012年11月16日 16:10
  • 29124

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

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

JAXB例子

JAXB介绍 JAXB是Java Architecture for XML Binding的缩写。提供了一个快速便捷的方式将Java对象与XML进行转换。在JAX-WS(Java的WebServic...

Spring Web Service 简明教程

通过学习Spring WebServices Peoject里的Get started文档,能够学习到大部分sws(spring web service)的使用。 http://docs.sprin...

Marshaller生成的xml去掉报文头、设置格式、不处理转义字符的方法

try { JAXBContext context = JAXBContext.newInstance(Entity.class); Marshaller marshaller = con...

JAXB命名空间及命名空间前缀处理

本篇介绍下JAXB进阶使用,命名空间处理 使用package-info.java添加默认命名空间 在需要添加命名空间的包下面添加package-info.java文件,然后添加@XmlSchema注...

JAXB--@XmlElementWrapper注解和泛型一起使用(三)

当java对象的某个属性使用泛型时,普通对象都没问题,但是遇到HashSet这种集合类封装的元素时,就会出现元素内容序列化不出来的问题,详见如下:   一、示例: 第一步:定义jav...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Remove xsi:type after marshalling abstract class with hierarchy 删除xml节点中的xsi:type xmlns:xsi
举报原因:
原因补充:

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