web-dev-qa-db-ja.com

JAXB名前空間プレフィックスがありません

私はXSDからJavaクラスを生成しましたが、すべて非整列化の観点からは問題なく動作します。

ただし、JAXBクラスからマーシャリングすると、次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message xmlns="http://poc.cmc.com/ScreenLayout">
    <Data>
        <Type>Sample</Type>
     . . .
</message>

しかし、私は必要です

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns0:message xmlns:ns0="http://poc.cmc.com/ScreenLayout">
    <ns0:Data>
        <ns0:Type>Sample</ns0:Type>
    . . .

それをJavaからどのように制御できますか?

どうもありがとう

30
Arthur .

@XmlSchemaアノテーションpackage-infoクラスをプレフィックスを名前空間に割り当てます。

@XmlSchema(
    namespace = "http://poc.cmc.com/ScreenLayout",
    elementFormDefault = XmlNsForm.QUALIFIED,
    xmlns={@XmlNs(prefix="ns0", namespaceURI="http://poc.cmc.com/ScreenLayout")})    
package your.package;


import javax.xml.bind.annotation.*;
34
bdoughan

これをコメントとして投稿できません!

消費するアプリケーションは非常に馬鹿げており、プレフィックスが必要なため

その場合、ダムアプリケーションは実際にはxmlを消費しません。このリンクを見てください http://bdoughan.blogspot.com/2010/08/jaxb-namespaces.html と名前空間オプションを試してください。具体的には

@XmlSchema (
   xmlns = {
         @javax.xml.bind.annotation.XmlNs(prefix = "ns1", namespaceURI="http:test"),
         @javax.xml.bind.annotation.XmlNs(prefix = "xsd", namespaceURI="http:www.w3.org2001XMLSchema")
   },
   namespace = "http:test",
   elementFormDefault = XmlNsForm.UNQUALIFIED,
   attributeFormDefault = XmlNsForm.UNSET
)

package-info.Javaファイルで使用されます。

@XmlType(namespace="http://www.example.org/type")

クラス宣言で使用

@XmlElement(namespace="http://www.example.org/property")

プロパティで使用されます。

いくつかの組み合わせまたはこれらのオプションの1つだけで、必要なものが得られる場合があります。ただし、有効なxmlから、すべての要素に特定の名前空間プレフィックスを含む必要があるxmlに移動するときは、困難な戦いに直面していることを理解する必要があります。

8
Heathen

XML仕様によると、xmlns = ""は現在の要素とすべての子要素に適用されるデフォルトの名前空間を定義するため、両方のxmlは同じです。 XMLパーサーは、どちらの場合も同じDOMまたはSAXを提供する必要があります

2
Sergey Aslanov