Подтвердить что ты не робот

Удалить 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;

Я что-то пропустил? или я неправильно понял, как это работает?

4b9b3361

Ответ 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'