2

JAXB を使用して単純な XML (CSDL のサブセット) をアンマーシャリングしているときに問題が発生しました。
誰かが過去に私を支援しようとしましたが (ここ)、部分的に機能しており、どうすればよいかわかりません...
次の XML を検討してください:

<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
  <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="3.0">
    <Schema xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:sap="http://www.sap.com/Protocols/SAPData" xmlns="http://schemas.microsoft.com/ado/2009/11/edm" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" Namespace="myNS">
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>

私が言われたように、(同じパッケージ内に)次のようなpackage-info.javaファイルがあります。

@XmlSchema(
  namespace="http://schemas.microsoft.com/ado/2007/06/edmx",
  elementFormDefault=XmlNsForm.QUALIFIED,
  xmlns={
          @XmlNs(prefix="edmx", namespaceURI="http://schemas.microsoft.com/ado/2007/06/edmx"),
          @XmlNs(prefix="", namespaceURI="http://schemas.microsoft.com/ado/2009/11/edm"),
          @XmlNs(prefix="m", namespaceURI="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata")                                
  }
)
@XmlAccessorType(XmlAccessType.FIELD)
package com.sap.ndb.studio.rdl.csdlparser.jaxb.objects;

import javax.xml.bind.annotation.*;

さらに、次のデータ構造があります:

Edmx.java

package com.sap.ndb.studio.rdl.csdlparser.jaxb.objects;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Edmx")
public class Edmx {

    @XmlElement(name = "DataServices")
    private DataService dataService;

    public DataService getDataService() {
          return dataService;
    }
}

DataService.java

package com.sap.ndb.studio.rdl.csdlparser.jaxb.objects;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class DataService {

    @XmlElement(name = "Schema")
    private Schema schema;

    @XmlAttribute(name = "DataServiceVersion")
    private double version;

    public Schema getSchema() {
      return schema;
    }
 }

スキーマ.java

package com.sap.ndb.studio.rdl.csdlparser.jaxb.objects;

@XmlRootElement
public class Schema {
  ....
}

注意: Schema.java には、XML に関連しない実装がいくつかあるため、削除しました (内部ロジック)。

JAXB を使用して XML をアンマーシャリングした後、返された Edmx オブジェクトには、'schema' メンバーと 'version' メンバーの両方に null 値が含まれていますが、package-info.java ですべての xmlns パラメーターについて言及しました。

誰?:(

4

1 に答える 1

0

アップデート

以前の質問の 1 つに対する私の回答では、この質問からモデルのマッピングを提供します。

あなたが行った次のコメントに対処するために、この回答を更新しました。

「namespace=schemas.microsoft.com/ado/2009/11/edm」を宣言する必要があるのはなぜですか。私の@XmlElementで?面倒で申し訳ありません(これはJAXBでの私の最初の経験です)が、「スキーマ」に似た多くの@XmlElementノードを含む長いXMLが必要であり、それらの名前空間を一度だけ宣言したいと思います...

対応する名前空間に基づいてモデル クラスをさまざまなパッケージに編成することで、名前空間を宣言する必要がある回数を減らすことができます。

名前空間のパッケージ 1http://schemas.microsoft.com/ado/2007/06/edmx

パッケージ情報

パッケージごとに、@XmlSchemaアノテーションを使用して名前空間修飾を指定します。この例では、この特定のパッケージの名前空間のみを指定する必要があります。

@XmlSchema(
        namespace="http://schemas.microsoft.com/ado/2007/06/edmx",
        elementFormDefault=XmlNsForm.QUALIFIED,
        xmlns={
                @XmlNs(
                    prefix="edmx", 
                    namespaceURI="http://schemas.microsoft.com/ado/2007/06/edmx"
                ),
        }
)
@XmlAccessorType(XmlAccessType.FIELD)
package forum14875956.edmx;

import javax.xml.bind.annotation.*;

Edmx

クラスに対応する XML 要素は、このパッケージEdmxの注釈で定義した内容に従って名前空間修飾されます。@XmlSchema

package forum14875956.edmx;

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "Edmx")
public class Edmx {

    @XmlElement(name = "DataServices")
    private DataService dataService;

    public DataService getDataService() {
        return dataService;
    }

}

データサービス

DataServiceクラスには、別の XML 名前空間に対応するクラスへの参照が含まれています。Schemaクラスが同じパッケージにある場合は、@XmlElementアノテーションを使用して名前空間の修飾をオーバーライドできます。Schemaは別のパッケージにあるため、アノテーションを使用できます@XmlElementRef。これにより、そのクラス用に構成されたルート要素から要素情報を取得するよう JAXB に指示されます。

package forum14875956.edmx;

import javax.xml.bind.annotation.*;
import forum14875956.schema.Schema;

public class DataService {

    //@XmlElement(namespace="http://schemas.microsoft.com/ado/2009/11/edm", name="Schema")
    @XmlElementRef
    private Schema schema;

    public Schema getSchema() {
        return schema;
    }

}

名前空間のパッケージ 2http://schemas.microsoft.com/ado/2009/11/edm

再び を使用し@XmlSchemaて、2 番目のパッケージの名前空間情報を宣言します。

パッケージ情報

@XmlSchema(
        namespace="http://schemas.microsoft.com/ado/2009/11/edm",
        elementFormDefault=XmlNsForm.QUALIFIED,
        xmlns={
                @XmlNs(
                    prefix="", 
                    namespaceURI="http://schemas.microsoft.com/ado/2009/11/edm"
                )
        }
)
@XmlAccessorType(XmlAccessType.FIELD)
package forum14875956.schema;

import javax.xml.bind.annotation.*;

スキーマ

クラス内の要素は、そのパッケージSchemaの注釈内の名前空間修飾ベースの名前空間情報になります。@XmlSchema

package forum14875956.schema;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Schema")
public class Schema {

}

元の答え

schemaプロパティのマッピングに名前空間 URI を含める必要があります。

@XmlRootElement
public class DataService {

    @XmlElement(name = "Schema" , namespace="http://schemas.microsoft.com/ado/2009/11/edm")
    private Schema schema;

    @XmlAttribute(name = "DataServiceVersion")
    private double version;

    public Schema getSchema() {
      return schema;
    }
 }

完全な例

少し前に、このモデルの完全なマッピングを提供する質問の 1 つに答えました。

于 2013-02-21T15:18:38.830 に答える