删除ns2作为默认名称空间前缀

我有一个使用默认命名空间打印的文件。 这些元素使用前缀ns2打印,我需要将其删除,我的代码如何:

 

我希望它如何:

  

这就是我编写它的方式,正如我所看到的那样,ns2应该足够了:

   ... 

生成的package-info结果如下:

 @javax.xml.bind.annotation.XmlSchema(namespace = "http://namespace", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package com.foo.bar; 

我创建这样的文件:

 JAXBContext jaxbContext = JAXBContext.newInstance(generatedClassesPackage); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(new JAXBElement(new QName("http://namespace", "Foo"), Foo.class, rootFoo), outputStream); 

generatedClassesPackage是package-info.java和元素所在的包。

Foo对象已定义,并具有以下元素::

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "group" }) @XmlRootElement(name = "Foo") public class Foo { @XmlElement(name = "Group", required = true) protected List group; 

这是我错过的东西吗? 或者我误解了它是如何工作的?

很可能您在响应中有多个名称空间。 这将使用创建ns#namespace前缀的默认约定,其中一个成为没有前缀的xmlns。 如果要控制它,可以执行以下操作:

 NamespacePrefixMapper mapper = new NamespacePrefixMapper() { public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { if ("http://namespace".equals(namespaceUri) && !requirePrefix) return ""; return "ns"; } }; marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper); marshaller.mashal.... 

这将把http://namespace为默认的xmlns,并在编组时使用ns#作为所有其他名称空间。 如果需要,您还可以为它们提供更多描述性前缀。

您需要做的就是当您打开一个新包时,在包信息中选择创建包信息添加以下注释或根据需要进行更改

 @javax.xml.bind.annotation.XmlSchema(namespace = "http://www.sitemaps.org/schemas/sitemap/0.9", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns = { @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.sitemaps.org/schemas/sitemap/0.9", prefix = "") }) 

这将删除ns2前缀

从JDK6u18开始,不再使用NamespacePrefixMapper技术。

我解决了这个问题,将文件package-info.java删除到jaxb classes包中并重新编译应用程序。

对于Java 8:

我将前缀名称从’ ns2 ‘变为’ fault ‘。

首先 ,创建您的* DefaultNamespacePrefixMapper *。

 import com.sun.xml.bind.marshaller.NamespacePrefixMapper; import java.util.HashMap; import java.util.Map; public class DefaultNamespacePrefixMapper extends NamespacePrefixMapper { private static final String FAULT_PREFIX = "fault"; private Map namespaceMap = new HashMap<>(); public DefaultNamespacePrefixMapper() { this.namespaceMap.put(NAMESPACE, FAULT_PREFIX); } @Override public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { return namespaceMap.getOrDefault(namespaceUri, suggestion); } } 

其次 ,将DefaultNamespacePrefixMapper添加到Marshaller属性。

 @SuppressWarnings("unchecked") private  void returnFault(T fault, SoapFault soapFault) { try { JAXBContext jaxbContext = JAXBContext.newInstance(fault.getClass()); QName name = new QName(NAMESPACE, fault.getClass().getSimpleName()); JAXBElement element = new JAXBElement<>(name, (Class) fault.getClass(), fault); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new DefaultNamespacePrefixMapper()); marshaller.marshal(element, soapFault.addFaultDetail().getResult()); } catch (JAXBException e) { log.error("Exception when marshalling SOAP fault.", e); } } 

第三 ,在gradle / maven中添加以下依赖项。

 compile 'com.sun.xml.bind:jaxb-impl:2.2.11' compile 'com.sun.xml.bind:jaxb-core:2.2.11'