2013-05-16 83 views
14

既定の名前空間で印刷されたファイルがあります。ns2を既定の名前空間プレフィックスとして削除します

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

これは私が持っているかである:私はそれになりたい方法を

<ns2:foo xmlns:ns2="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"> 
... 

生成されたパッケージ情報は次のように判明:

私はNS2が離れて行くすることは十分なはず参照として何か、それをコード化0
@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); 

generatedClassesPackageが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

名前空間を与えて修飾した場合、xsdごとに有効な名前空間を置く必要があります。名前空間を完全に削除するか、接頭辞を管理しやすいものに変更するか、トップレベル要素を変更してメイン名前空間のxmlnsを持つようにして、その名前空間内に何かのプレフィックスがないようにすることができます。だからあなたが望むのはxsdsごとに有効なxmlではありません。名前空間要素を必要としますか? –

+1

私はfoo要素の属性を表示しないで私を混乱させたと思います。あなたは ''の代わりに '

+0

@DMosesはい、私はそれを含んでいて、はい、それは私がそれを望む方法です。私はこれが欲しい: xmlns:ns2 = "http://名前空間" ルート要素です。 – Vegard

答えて

6

ほとんどの場合、応答に複数の名前空間があります。これは、ns#名前空間接頭辞を作成するデフォルトの規約を使用し、その1つは接頭辞なしの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.... 

これが常にデフォルトのxmlnsとしてhttp://namespaceを設定し、マーシャリングの際に他のすべての名前空間のNS#を使用します。必要に応じて、接頭辞をよりわかりやすく説明することもできます。

+0

これは一種です! :)ありがとうございました。問題は実際には複数の名前空間でした。スキーマをインポートするスキーマが1つありましたが、これが問題の原因です。ここに投稿したコードは直接動作しませんでしたが、私は複数のスキーマを修正してからコードを再生成して解決しました。 – Vegard

+1

NamespacePrefixMapperは、JDKの内部クラスになりました。だから、このソリューションはもはやカウントしません。 – Strinder

5

JDK6u18から始まって、NamespacePrefixMapper技術はもう使用されません。

10

新しいパッケージを開いたときに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
を削除します

私はこれを解決して、package-info.javaファイルをjaxbクラスパッケージに削除し、アプリケーションを再コンパイルします。

+0

はい!生成された 'package-info.java'には' @ javax.xml.bind.annotation.XmlSchema'が含まれていますが、これは問題のようです。 –

+0

私も助けました。ありがとう – Akash

関連する問題