8

JAXBを使用して、スキーマがDTDによって定義されているXMLファイルをアンマーシャリングしようとしています(うーん!)。

DTDの外部プロバイダーは、要素属性の1つを次のように指定していますxml:lang

<!ATTLIST langSet
id ID #IMPLIED
xml:lang CDATA #REQUIRED
>

これは、xjcで生成されたクラス(標準生成、*。xjbマジックなし)に次のように組み込まれます。

@XmlAttribute(name = "xml:lang", required = true)
@XmlJavaTypeAdapter(NormalizedStringAdapter.class)
protected String xmlLang;

ただし、JAXBを使用して有効なXMLファイルをアンマーシャリングする場合、xmlLang属性は常にnullです。

XMLファイルを編集し、に置き換えxml:langて一致するようlangに変更する@XmlAttributeと、アンマーシャリングが成功しました(つまり、属性が非でしたnull)。

私はこれをhttp://old.nabble.com/unmarshalling-ignores-element-attribute-%27xml%27-td22558466.htmlで見つけました。しかし、そこでの解決策はXMLスキーマなどに変換することでした。私の強い好みは、変更されていないDTDから直接移行することです(外部から提供され、ISO標準によって定義されているため)。

これはJAXBのバグですか?属性名の「名前空間」について何かが足りませんか?

FWIW、java -version="ビルド1.6.0_20-b02"およびxjc -version="xjcバージョン"JDK6のJAXB2.1.10 ""

4

2 に答える 2

7

JAXBで生成されたクラスの宣言で置換xml:を変更することで問題を解決しました。namespace

@XmlAttribute(name = "lang", namespace="http://www.w3.org/XML/1998/namespace", required = true)

ある意味、これは理にかなっています。

この種のガイダンスがなければ、JAXBは他の方法で定義されていない名前空間を解釈する方法をどのように知るのでしょうxml:か?もちろん、 http://java.sun.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html#getNamespaceURI%28java.langxml:で行われているように、特別な場合の内部処理を実装していない限り、.String%29(最初のを参照してください:)

それxjcが注釈付きオブジェクトの生成のバグなのか、アンマーハラーのバグなのか、それとも単にxjcプロセスのどこかにマッピングが必要なのかは、まだ私の頭の中で未解決の質問です。

今のところ、それは機能していて、必要なのはちょっとしたxjc魔法だけなので、私はかなり満足しています。

于 2010-06-10T18:34:07.387 に答える
1

免責事項:8年遅れていますが、DTDからのJavaファイルの自動生成を理解しようとしている自分のような失われた魂のためにこの答えを追加しています。

@XmlSchemaオプションを使用して、プロジェクト全体の名前空間をunmarshallerがproject-info.javaファイルで直接操作するように設定できます。

このファイルは、スキーマからクラスを生成するときにxjcによって自動的に生成される必要がありますが、DTDから生成するときにxjcがpackage-info.javaファイルを自動的に生成しないようです。

ただし、このファイルを手動で作成し、xjcによって生成されたファイルと同じパッケージに追加することができます。

ファイルは次のようになります。

package-info.java:

@XmlSchema(
    elementFormDefault=XmlNsForm.QUALIFIED, 
    xmlns = {
            @XmlNs(prefix="xlink", namespaceURI="http://www.w3c.org/1999/xlink"),
            @XmlNs(prefix="namespace2", namespaceURI="http://www.w3c.org/1999/namespace2")
    }) 

package your.generated.package.hierarchy;
import javax.xml.bind.annotation.*;

必要な数の名前空間を追加できます。フォームに新しい行を追加するだけです。

@XmlNs(prefix="namespace", namespaceURI="http://www.uri.to.namespace.com")

生成されたものを編集するのではなく、この方法で行うことの利点は、生成さ@XmlAttributeれた各XmlAttributeを変更する必要がなく、XmlAttributename変数から名前空間を手動で削除する必要がないことです。

于 2018-06-21T20:46:37.033 に答える