web-dev-qa-db-ja.com

JAXB-要素を無視

Jaxb解析の要素を無視する方法はありますか?大きなXMLファイルがあり、大きくて複雑な要素の1つを無視できれば、おそらくより速く解析できます。

要素の内容をまったく検証できず、その要素が正しくない場合でもドキュメントの残りの部分を解析できなければ、さらに良いでしょう。

例:これはFoo.element1とFoo.element2のみを生成する必要があります

<foo>
    <element1>I want this</element1>
    <element2>And this</element2>
    <bar>
       <a>ALL of bar should be ignored</a>
       <b>this also should be ignored</b>
       <c>
           <x>a lot of C that take time to process</x>
       </c>
       <c>
            <x>a lot of C that take time to process</x>
       </c>
       <c>
          <x>a lot of C that take time to process</x>
       </c>
      <c>
          <x>a lot of C that take time to process</x>
      </c>
  </bar>
</foo>
29
questioner

JAXBモデルが次のようになっていると仮定します。

@XmlRootElement(name="foo")
public class Foo {

   @XmlElement(name="element1")
   String element1;

   @XmlElement(name="element2")
   String element2;

   @XmlElement(name="bar")
   Bar bar;
}

barからFooフィールドを削除するだけで、入力ドキュメントの<bar/>要素がスキップされます。

または、フィールドに@XmlTransientの代わりに@XmlElementの注釈を付けます。これもスキップされます。

38
skaffman

JAXBは、マップされていないプロパティを無視します。

賢明な実装(少なくとも EcliseLink JAXB(MOXy) 、私がリード)。 SAXパーサーを介してコンテンツを処理している場合(つまり、入力がSAXSourceであった場合)、オブジェクトを構築するContentHandlerを、そのセクションの処理を行わないContentHandler(org.Eclipse.persistence.oxm.unmapped)に交換します。 UnmappedContentHandler)。 StAXパーサーを介してコンテンツの処理を使用している場合、次のマップされたイベントに進みます。

そのノードに対応するプロパティがある場合は、 @ XmlTransient で注釈を付けて、マッピングされていないプロパティにすることができます。

12
bdoughan

必要なものはすべて@XmlTransientのマークフィールドです(不要なフィールドを非表示にする@XmlTransientアノテーション)。下の例

JavaEE:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "DeletedIds")
public class DeletedIds {

    @XmlElement(name = "DeletedId")
    private List<DeletedId> id;    

    @XmlTransient
    @XmlElement(name = "success")
    private String success;

    //getters&setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class DeletedId {

    private int id;

    //getters&setters
}

XML:

<DeletedIds>
    <DeletedId>
        <id>1</id>
    </DeletedId>
    <DeletedId>
        <id>2</id>
    </DeletedId>
</DeletedIds>
3
Yahor M

SAXパーサーと、関心のないノードを効果的に「スキップ」するドキュメントハンドラーを使用する必要があります。バイトを読むことはできませんが、少なくとも余分なリソースを浪費させることはできます。

コードにDOMツリーが必要な場合は、基本的にDOMノードを生成するSAXドキュメントハンドラーを使用しますが、対象外のノードは「スキップ」します。提供されたDOMツリージェネレーターを使用するよりも明らかに便利ではありませんが、適切なトレードオフは、不要なノードの余分なメモリオーバーヘッドに耐えることはできませんが、DOMツリーが必要です。

1
Edwin Buck