Похоже на Настройка сопоставления пространства имен JAXB
Когда вы маршалируете XML-документ с использованием JAXB 1.0, объект Marshaller, JAXB-объект, который управляет процессом маршаллинга, предоставляет объявления пространства имен в результирующем XML-документе. Иногда Marshaller создает множество объявлений пространства имен, которые выглядят избыточными, например:
<?xml version="1.0"?>
<root>
<ns1:element xmlns:ns1="urn:foo"> ... </ns1:element>
<ns2:element xmlns:ns2="urn:foo"> ... </ns2:element>
<ns3:element xmlns:ns3="urn:foo"> ... </ns3:element>
</root>
JAXB 2.0 меняет это поведение. Если вы используете JAXB 2.0 (или более позднюю версию) для упорядочивания XML-документа, Marshaller объявляет все статически известные универсальные идентификаторы ресурсов (URI) пространства имен, то есть те URI, которые используются в качестве имен элементов или атрибутов в аннотациях JAXB.
JAXB может также объявлять дополнительные пространства имен в середине документа XML, например, когда квалифицированное имя (QName
), которое используется в качестве значения атрибута или элемента, требует нового URI пространства имен или когда объектная модель документа ( DOM) узел в дереве контента требует нового URI пространства имен. Такое поведение может привести к XML-документу, который имеет много объявлений пространства имен с автоматически сгенерированными префиксами пространства имен.
Проблема заключается в том, что автоматически генерируемые префиксы пространства имен, такие как ns1, ns2 и ns3, не удобны для пользователя - обычно они не помогают людям понять маршаллированный XML.
К счастью, JAXB 2.0 (или более поздняя версия) предоставляет интерфейс поставщика услуг (SPI) с именем com.sun.xml.bind.marshaller.NamespacePrefixMapper
, который можно использовать для указания более полезных префиксов пространства имен для маршалинга.
Когда программа JAXBSample выполняет маршалинг XML-документа в первый раз, она делает это без использования NamespacePrefixMapper
класса. В результате Marshaller автоматически генерирует префикс пространства имен, в данном случае ns2.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:JustAnElement xmlns:ns2="a">
<foo>true</foo>
</ns2:JustAnElement>
Пример конфигурации, избегающей повторения пространства имен:
Второй маршаллинг, выполняемый программой JAXBSample
, использует класс NamespacePrefixMapper
следующим образом:
NamespacePrefixMapper m = new PreferredMapper();
marshal(jc, e, m);
public static class PreferredMapper extends NamespacePrefixMapper {
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
return "mappedNamespace" + namespaceUri;
}
}
Метод getPreferredPrefix()
в классе PreferredMapper
возвращает предпочтительный префикс, в данном случае mappedNamespacea
, который будет объявлен в корневом элементе маршализованного XML.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mappedNamespacea:JustAnElement xmlns:mappedNamespacea="a">
<foo>true</foo>
</mappedNamespacea:JustAnElement>