web-dev-qa-db-fra.com

Supprimer ns2 comme préfixe d'espace de nom par défaut

J'ai un fichier qui est imprimé avec un espace de noms par défaut. Les éléments sont imprimés avec un préfixe ns2, j'ai besoin de le supprimer, comment il se trouve avec mon code:

<ns2:foo xmlns:ns2="http://namespace" />

comment je veux que ce soit:

<foo xmlns="http://namespace" />

voici comment je l'ai codé, ce qui, à mon avis, devrait suffire à faire disparaître le 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">
...

les informations de paquet générées se présentent comme ceci:

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

Je crée le fichier comme ceci:

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 est le package dans lequel se trouvent package-info.Java et les éléments.

L'objet Foo est défini et a des éléments comme celui-ci:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "group"
})
@XmlRootElement(name = "Foo")
public class Foo {

    @XmlElement(name = "Group", required = true)
    protected List<Group> group;

Est-ce quelque chose que j'ai raté? ou ai-je mal compris comment cela fonctionne?

17
Vegard

Très probablement, la réponse contient plusieurs espaces-noms. Ceci utilisera la convention par défaut de création de préfixes d'espace de nom ns # et l'un d'eux devient le xmlns sans préfixe. Si vous souhaitez contrôler cela, vous pouvez procéder comme suit:

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....

Ceci définira toujours http://namespace comme xmlns par défaut et utilisera ns # pour tous les autres espaces de noms lors du marshalling. Vous pouvez également leur donner des préfixes plus descriptifs si vous le souhaitez.

6
Daniel Moses

Lorsque vous ouvrez un nouveau package, il vous suffit de sélectionner créer les informations de package. 

@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 = "") })

Cela supprimera le préfixe ns2 

16
yonia

Depuis JDK6u18, la technique NamespacePrefixMapper n'est plus utilisée.

6
s332401890

Je résous ce problème en supprimant le fichier package-info.Java dans le package de classes jaxb et en recompilant l'application.

3
Diego Maye

Pour Java 8:

Je chagnge le nom de préfixe de 'ns2' à 'fault'.

Premièrement , créez votre * 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 , ajoutez votre DefaultNamespacePrefixMapper à la propriété 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);
    }
}

Troisièmement , ajoutez les dépendances suivantes dans gradle/maven.

compile 'com.Sun.xml.bind:jaxb-impl:2.2.11'
compile 'com.Sun.xml.bind:jaxb-core:2.2.11'
0
Vladimir