Удалить ns2 как префикс пространства имен по умолчанию
У меня есть файл, который печатается с пространством имен по умолчанию. Элементы печатаются с префиксом 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">
...
сгенерированный пакет-информация получается следующим образом:
@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);
generateClassesPackage - это пакет, где 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;
Я что-то пропустил? или я неправильно понял, как это работает?
Ответы
Ответ 1
Скорее всего, в ответе есть несколько пространств имен. Это будет использовать соглашение по умолчанию для создания префиксов пространства имен ns #, и один из них становится 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
Все, что вам нужно сделать 2, - это когда вы открываете новый пакет, выберите создать информацию о пакете
в информации о пакете добавьте следующую аннотацию или измените ее по мере необходимости
@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
Ответ 3
Начиная с JDK6u18 техника NamespacePrefixMapper больше не используется.
Ответ 4
Я решаю это удаление файла package-info.java в пакет классов jaxb и повторное компиляцию приложения.
Ответ 5
Для Java 8:
я chagnge prefix name от '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<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);
}
}
Secondy, добавьте свойство 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'