36

デフォルトの名前空間で印刷されたファイルがあります。要素は 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">
...

生成された package-info は次のようになります。

@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;

それは私が見逃したものですか?または、これがどのように機能するかを誤解していますか?

4

7 に答える 7

33

必要なのは、新しいパッケージを開くときに、パッケージ情報でパッケージ情報の作成を選択することだけです。次の注釈を追加するか、必要に応じて変更します

@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 プレフィックスが削除されます

于 2015-01-11T08:35:37.323 に答える
11

ほとんどの場合、応答に複数の名前空間が含まれています。これは、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....

これによりhttp://namespace、常にデフォルトの xmlns として設定され、マーシャリング時に他のすべての名前空間に ns# が使用されます。必要に応じて、よりわかりやすいプレフィックスを付けることもできます。

于 2013-05-16T14:47:21.543 に答える
5

package-info.java ファイルを jaxb クラス パッケージに削除し、アプリケーションを再コンパイルすることで、この問題を解決しました。

于 2015-04-16T15:10:41.623 に答える
0

@XmlRootElement から名前空間を削除します

前:XmlRootElement(name = "XXX", namespace = "abc.xsd")

後:@XmlRootElement(name = "XXX")

于 2021-02-05T17:56:39.310 に答える