【问题标题】:Remove extra annotation ns2 using NamespacePrefixMapper使用 NamespacePrefixMapper 删除额外的注释 ns2
【发布时间】:2013-02-07 08:58:12
【问题描述】:

我想删除 marshal 使用 NamespacePrefixMapper 类而不是使用 package-info.java 文件生成的 xml 中的额外注释 ns2。

我的代码如下:

请求类:

package com.example;
import javax.xml.bind.annotation.*;

@XmlType(propOrder = { "password", "title", "firstName", "lastName", "email"})

@XmlRootElement

public class Req {

  private String password;
  private String title;
  private String firstName;
  private String lastName;
  private String email;

  @XmlElement(name= "Password")
public String getPassword() {
    return password;
}
 public void setPassword(String password) {
    this.password = password;
}

@XmlElement(name= "Title")
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
@XmlElement(name= "FirstName")
public String getFirstName() {
    return firstName;
}
public void setFirstName(String firstName) {
    this.firstName = firstName;
}
@XmlElement(name= "LastName")
public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}

@XmlElement(name= "Email")
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}

}  

PreferredMapper 类:

package com.example;

import javax.xml.namespace.NamespaceContext;
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

public class PreferredMapper extends NamespacePrefixMapper{

    private static final String URI ="http://schema.bsi.ib.example/service/request/v1";

    @Override
        public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {

        if(URI.equals(namespaceUri)) {
            return "";
        } 

        return suggestion;
    }
        @Override
        public String[] getPreDeclaredNamespaceUris() {
            return new String[] { URI };
        }

}

测试类:

package com.example;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import com.example.Req;
import com.example.PreferredMapper;
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;


public class Test {
    public static void main(String args[]) throws JAXBException
    {

        setRequest("Tiger123", "Miss","Rose","Crocker","hello@world.com");

    }

    public static void setRequest(String passWord, String title, String firstName, String lastName,String email) throws JAXBException
    {
        JAXBContext context = JAXBContext.newInstance(Req.class);

        Req ibw=new Req();

        ibw.setEmail(email);
        ibw.setPassword(passWord);
        ibw.setTitle(title);
        ibw.setFirstName(firstName);
        ibw.setLastName(lastName);

        JAXBElement<Req> element=new JAXBElement<Req> (new QName("http://schema.bsi.ib.example/service/request/v1","CustomerProfile"),Req.class,ibw);
        Marshaller m=context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
        m.setProperty("com.sun.xml.bind.namespacePrefixMapper", new PreferredMapper());

        m.marshal(element, System.out);

    }   
}

输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:CustomerProfile xmlns:ns2="http://schema.bsi.ib.example/service/request/v1">
    <Password>Tiger123</Password>
    <Title>Miss</Title>
    <FirstName>Rose</FirstName>
    <LastName>Crocker</LastName>
    <Email>hello@world.com</Email>
</ns2:CustomerProfile>

无法使用上述代码删除 ns2,请帮助

【问题讨论】:

  • 您是否有理由无法使用 package-info 注释执行此操作?
  • 不,我可以处理 package-info 注释,我也想处理 namespaceprefixmapper

标签: xml jaxb marshalling


【解决方案1】:

如果您想“删除 ns2”但在语义上保持 XML 相同,那么您最终会得到类似的东西

<CustomerProfile xmlns="http://schema.bsi.ib.example/service/request/v1">
    <Password xmlns="">Tiger123</Password>
    <Title xmlns="">Miss</Title>

因为目前只有 CustomerProfile 元素在命名空间中,所以它的子元素不在。请记住,您在映射器中建议的前缀映射只是 - 建议 - 如果编组器认为它们不合适,它可能会忽略它们。

我认为您拒绝修改 package-info,因为您想从现有的 .xsd 生成所有内容。您是否可以修改此架构并将elementFormDefault="qualified" 添加到&lt;xs:schema&gt; 元素?如果你能做到,那么

<CustomerProfile xmlns="http://schema.bsi.ib.example/service/request/v1">
    <Password>Tiger123</Password>
    <Title>Miss</Title>

(没有xmlns="")将变得有效,您现有的映射器可能会开始工作。

如果您不能修改架构,那么您可能不想在CustomerProfile 上使用默认命名空间...

【讨论】:

  • 我不能在@Xmlschema 中给出 elementFormDefault ="qualified" 因为我不想使用 package-info.java 文件
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
相关资源
最近更新 更多