2013-05-16 6 views
14

Ich habe eine Datei, die mit einem Standardnamespace gedruckt wird. Die Elemente mit dem Präfix ns2 gedruckt werden, muss ich diese entfernt werden, wie es mit meinem Code ist:Entfernen Sie NS2 als Standard-Namespacepräfix

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

, wie ich es sein will:

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

das ist, wie ich codiert es, etwas, was wie ich es sehe genug sein sollte für die ns2 gehen weg:

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

das erzeugte Paket-Info stellt sich heraus, wie folgt aus:

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

ich erstellen Sie die Datei wie folgt aus:

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 ist das Paket, wo package-info.java und die Elemente sind.

Das Objekt Foo definiert ist und Elemente wie folgt ::

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

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

Ist es etwas, was ich verpasst haben? oder habe ich missverstanden, wie das funktioniert?

+1

Wenn Sie ihm einen Namespace geben und ihn qualifiziert machen, muss er den Namespace irgendwo platzieren, um gemäß dem xsd gültig zu sein. Sie können den Namespacing vollständig entfernen oder das Präfix ändern, damit es besser verwaltet wird, oder das Element der obersten Ebene so ändern, dass es die xmlns des Hauptnamespace enthält, so dass für nichts in diesem Namespace keine Präfixe vorhanden sind. Was Sie wollen, ist kein gültiger XML-Code für Ihre xsds. Willst du Namespace-Elemente oder nicht? –

+1

Ich glaube, du hast mich verwirrt, weil ich die Attribute auf diesem foo Element nicht gezeigt habe. Willst du damit sagen, dass du '' anstelle von ''? –

+0

@DMoses ja, ich hätte das aufgenommen, und ja, so will ich es :). Ich möchte das: xmlns: ns2 = "http: // Namespace" im Stammelement. – Vegard

Antwort

6

Höchstwahrscheinlich haben Sie mehrere Namespaces in der Antwort. Dies verwendet die Standardkonvention des Erstellens von ns # Namespacepräfixen und eines davon wird zum xmlns ohne Präfix. Wenn Sie dies steuern möchten, können Sie folgendes tun:

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

Dies wird die http://namespace als Standard Xmlns immer gesetzt und ns # für alle anderen Namensräumen verwenden, wenn Rangier. Sie können ihnen auch beschreibende Präfixe geben, wenn Sie möchten.

+0

das war eine Art davon! :) Vielen Dank für die Hilfe. Das Problem war in der Tat mehrere Namespaces. Ich hatte ein Schema, das ein anderes importierte, das verursachte das Problem. Der Code, den Sie hier gepostet haben, hat nicht direkt funktioniert, aber ich habe ihn gelöst, indem ich die verschiedenen Schemas korrigiert und den Code neu generiert habe. – Vegard

+1

Es sollte beachtet werden, dass NamespacePrefixMapper jetzt eine interne Klasse im JDK ist. Also zählt diese Lösung nicht mehr ... – Strinder

5

Ab JDK6u18 wird die NamespacePrefixMapper-Methode nicht mehr verwendet.

10

Alles, was Sie 2 tun müssen, ist, wenn Sie ein neues Paket Paketinformationen erstellen wählen öffnen im Paketinformation die folgende Anmerkung hinzuzufügen oder als

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

Dies wird den ns2 Präfix

entfernen
3

Ich löse das Löschen der Datei package-info.java in das Jaxb-Klassenpaket und kompiliere die Anwendung neu.

+0

Ja! Das generierte 'package-info.java' enthält ein' @ javax.xml.bind.annotation.XmlSchema', welches das Problem zu sein scheint. –

+0

Hat mir auch geholfen. Vielen Dank – Akash