我有一个使用默认命名空间打印的文件。这些元素使用前缀ns2打印,我需要将其删除,以及如何使用我的代码:
<ns2:foo xmlns:ns2="http://namespace" />
我希望如何:
<foo xmlns="http://namespace" />
这就是我编写它的方式,正如我所看到的那样,ns2应该足够了:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:bar="http://namespace" targetNamespace="http://namespace"
elementFormDefault="qualified">
...
生成的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<Foo>(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> group;
这是我错过的吗?或者我误解了它是如何工作的?
答案 0 :(得分:18)
您需要做的就是当您打开新包时选择创建包信息 在包信息中添加以下注释或根据需要进行更改
@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前缀
答案 1 :(得分:6)
很可能您在响应中有多个名称空间。这将使用创建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#用于所有其他命名空间。如果需要,您还可以为它们提供更多描述性前缀。
答案 2 :(得分:6)
从JDK6u18开始,不再使用NamespacePrefixMapper技术。
答案 3 :(得分:3)
我解决了这个问题,将文件package-info.java删除到jaxb classes包中并重新编译应用程序。
答案 4 :(得分:0)
对于Java 8:
我将前缀名称从' ns2 '更改为'故障'。
首先,创建您的* 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<String, String> 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 <T> void returnFault(T fault, SoapFault soapFault) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(fault.getClass());
QName name = new QName(NAMESPACE, fault.getClass().getSimpleName());
JAXBElement<T> element = new JAXBElement<>(name, (Class<T>) 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'
答案 5 :(得分:0)
在
中更改elementFormDefault =“ unqualified”的属性值<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:bar="http://namespace" targetNamespace="http://namespace" elementFormDefault="qualified">
答案 6 :(得分:0)
从@XmlRootElement 中删除命名空间
之前:XmlRootElement(name = "XXX", namespace = "abc.xsd")
之后:@XmlRootElement(name = "XXX")