8

これが私のXSDファイルからのささいな抜粋です

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="ns"
    xmlns:tns="sns" elementFormDefault="qualified">

  <element name="document">
        <attribute name="title" use="required"/>
  </element>
</schema>

maven-jaxb2-pluginこれからJavaクラスを生成するためにを使用します。このDocumentクラスには、属性getTitle()のテキストを返すメソッドがあります。title

にメソッドを追加したいDocument

public String getStrippedTitle() {
   return getTitle().replaceAll("\\s+", "");
}

トップレベルのマーシャリングされていないオブジェクトを文字列テンプレートに渡し、サブ要素を反復処理して自分の追加のメソッド。

手順を見つけましたが、プロパティを設定するように指示Unmarshallerされており、(Mac OS X、Java 7)実装はプロパティをサポートしていないようです。

これはどのようにすればよいですか?

4

2 に答える 2

8

Brian Henry が提供したリンクをたどると、自分のスキーマ ファイルでバインドのカスタマイズをインラインで実行して、自分のやりたいことを実行できることがわかりました。効果はブライアンのソリューションとまったく同じですが、への参照への参照は必要ありませんcom.sun.xml.internal

まず、スキーマ ファイルが多少変更されます。

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="ns"
    xmlns:tns="sns" elementFormDefault="qualified"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">

  <element name="document">
      <annotation>
          <appinfo>
              <jaxb:class implClass="DocumentEx" />
          </appinfo>
      </annotation>
      <attribute name="title" use="required"/>
  </element>
</schema>

スキーマが Java コードにコンパイルされると、生成された ObjectFactory はDocumentExではなく を参照しDocumentます。 DocumentEx私が作成するクラスで、次のようになります。

public class DocumentEx extends Document {
   public String getStrippedTitle() {
       return getTitle().replaceAll("\\s+", "");
   }
}

Document(私が拡張しているクラス) は、スキーマから Java へのコンパイラーによって引き続き生成されます。ドキュメントを非整列化すると、実際に DocumentEx オブジェクトを取得します。

    JAXBContext jaxbContext = JAXBContext.newInstance("com.example.xml");
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    unmarshaller.setSchema(testSchema);
    DocumentEx doc = (DocumentEx)unmarshaller.unmarshal(xmlFile);

これに関する (解析が難しい) ドキュメントがOracleにあり、いくつかの役立つ例がO'Reillyにあります。

于 2013-01-11T22:01:01.403 に答える
2

リンクされたドキュメントに表示されているプロパティ名を更新してみてください。代わりにこれを試してください:

com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.FACTORY

また

"com.sun.xml.internal.bind.ObjectFactory"

私はあなたが見ていると思うPropertyExceptionを乗り越えることができると思います。ここでの最も完全な回答は、これが機能することが保証されていないことを示唆していますが、ここまで来たので試してみる価値があります。ソース コードは、私が見た限り (そう遠くない)、このプロパティをサポートしているようです。

于 2013-01-11T20:37:49.397 に答える