1

プロジェクトで JAXB を使用していますが、解決できない問題に直面することがあります。私は次のように環境をセットアップしました:

アーマークラス

package com.fortresswars.entity.component;

@XmlType(name = "armor", namespace = "http://fortresswars.com")
public class ArmorComponent extends AbstractComponent

パッケージ情報.java

@XmlSchema(xmlns = @XmlNs(namespaceURI = "http://fortresswars.com", prefix = "fw"), elementFormDefault = XmlNsForm.UNQUALIFIED, namespace = "http://fortresswars.com")
package com.fortresswars.entity.component;

生成されたスキーマ ヘッダーはほぼ正しいです。

<xs:schema elementFormDefault="unqualified" version="1.0" targetNamespace="http://fortresswars.com" xmlns:fw="http://fortresswars.com" xmlns:tns="http://fortresswars.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">

私が気に入らなかった唯一のことは、JAXB がそこに置いた TNS プレフィックスを削除できないことです。私は ant タスク ( com.sun.tools.jxc.SchemaGenTask) を使用していますが、これが問題であるとどこかで読んだことを覚えています。

生成されたスキームの残りの部分は以下のとおりです。鎧に関連する部分のみを示します。

<xs:complexType name="armor">
    <xs:complexContent>
      <xs:extension base="tns:abstractComponent">
        <xs:sequence>
          <xs:element name="value" type="xs:short" minOccurs="0"/>
          <xs:element name="type" type="tns:armor-type" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

そして、鎧コンポーネントを使用している要素:

  <xs:complexType name="character">
    <xs:complexContent>
      <xs:extension base="tns:thing">
        <xs:sequence>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="armor" type="tns:armor"/>
            <xs:element name="model" type="tns:model"/>
            <xs:element name="status" type="tns:status"/>
            <xs:element name="costs" type="tns:costs"/>
          </xs:choice>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

これをテストするために、XML ドキュメントを作成しました (TNS プレフィックスを参照してください。それを配置する必要があります。またはfwプレフィックスを xmlns:fw と共に追加する必要があります)。

<?xml version="1.0" encoding="UTF-8"?><tns:character xmlns:tns="http://fortresswars.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="/home/shirkit/jMonkeyProjects/Fortress Wars/Core/schema/full.xsd">

<armor>
<value>5</value>
<type>NORMAL</type>
</armor>

</tns:character>

しかし、このドキュメントをアンマーシャリングすると、次のエラーが表示されます。

Exception: unexpected element (uri:"", local:"armor"). Expected elements are <{http://fortresswars.com}armor>,<{http://fortresswars.com}attacks>,<{http://fortresswars.com}costs>,<{http://fortresswars.com}model>,<{http://fortresswars.com}abilities>,<{http://fortresswars.com}status>,<{http://fortresswars.com}movement>

elementFormDefault を UNQUALIFIED に​​設定しましたが、これは機能しません。なぜこの例外が発生するのですか? また、生成されたスキーマから TNS プレフィックスを削除できますか?

4

1 に答える 1

1

http://fortresswars.comの要素に名前空間プレフィックスを定義するときは、だけでなく、すべての要素にプレフィックスを付ける必要がありますcharacter。だからこれはうまくいくはずです

<?xml version="1.0" encoding="UTF-8"?>
<tns:character 
    xmlns:tns="http://fortresswars.com" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="/home/shirkit/jMonkeyProjects/Fortress Wars/Core/schema/full.xsd">
    <tns:armor>
        <tns:value>5</tns:value>
        <tns:type>NORMAL</tns:type>
    </tns:armor>
</tns:character>

スキーマで使用されるtnsプレフィックスは、マーシャリングを解除するXMLテキストのプレフィックスとして使用するものとは無関係です。で他のものを選択できますxmlns:whatyoulike="http://fortresswars.com"。XMLドキュメントの要素をスキーマファイルの定義に接続するキーは、名前空間URI(この場合は「http://fortresswars.com」)です。名前空間をデフォルトの名前空間として定義する場合は、すべての要素のプレフィックスを省略できます。

<?xml version="1.0" encoding="UTF-8"?>
<character 
    xmlns="http://fortresswars.com" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="/home/shirkit/jMonkeyProjects/Fortress Wars/Core/schema/full.xsd">
    <armor>
        <value>5</value>
        <type>NORMAL</type>
    </armor>
</character>

XSDファイルの名前空間プレフィックスは、同じ名前のタイプまたは要素を定義する他のスキーマファイルと一緒にスキーマファイルを使用したくない場合に、名前の衝突を回避するのに役立ちます。アンマーシャリングするxmlファイルで使用する必要はありません。

一方、オブジェクトをXMLにマーシャリングする場合、ファイルpackage-info.javaはJAXBが使用するプレフィックスを定義しますが、これはJAXBの最近のバージョンでのみ機能し、コードの実行時に正しいバージョンが使用されていることを確認するのは必ずしも簡単ではありません。ただし、を使用してNamespacePrefixMapperそれを制御できます。

于 2012-07-25T20:31:38.453 に答える