2

シナリオをより明確に指定するための編集。

xmlファイルを作成する必要があります。情報は複数のBean(Bean全体ではなく、一部のBeanのjsutサブセット)から取得され、一部のBeanにはリストが含まれています。したがって、xstreamに1つのルートBeanを指定して、 xml。また、いくつかのフォーマットはいくつかの条件を満たす必要があるかもしれませんが、前の問題は1つです

現在、私はJDOMを使用してメモリ内にドキュメントを作成しており、最終的にはXMLOutputterを使用してドキュメントをファイルに書き込みます。

しかし、私が書きたいBeanには、他のBeanなどの非常に大きなリストが含まれている可能性があり、使用されるメモリは非常に高くなる可能性があります。

だから私は記憶の面でより良い方法があるべきだと思いますか?xstreamを使用して大きなBean内にいくつかのBeanのxmlを作成し、それらをElementsとしてJDOMに追加しました。

プルパーサーを使用してxmlを解析するのにメモリ効率が高いのと同じ方法で、xmlの記述にも同じことが当てはまると期待していました。

4

5 に答える 5

1

xmlシリアル化ライブラリであるXstreamを試しましたか?

于 2011-04-05T11:03:34.773 に答える
1

これをまっすぐにしましょう:あなたは豆の木から始めます。これらを使用して、構造に従ってXMLドキュメントを作成したいが、独自の構文/スキーマを使用しているため、単純なBeanXMLシリアル化は問題外です...

そうであれば、BlaiseDoughanが推奨するJAXBが良い提案です。ただし、XMLフォーマットをより細かく制御する必要がある場合は、非常に具体的なシリアル化を行う必要があります。または、実行中にガベージコレクションを許可するために、XMLの作成中にBean参照を削除したい場合は、Streaming API for XML(StAX)が必要な場合があります。これを使用して、XML構造をストリームに書き込むことができます。

http://download.oracle.com/javase/6/docs/api/javax/xml/stream/package-summary.html

それがあなたの意図したものと正確に一致しない場合は申し訳ありません。間違っている場合は、簡単な使用シナリオを教えてください。

于 2011-04-05T11:44:20.760 に答える
0

http://commons.apache.org/betwixt/を試すこともできます

于 2011-04-05T11:36:06.187 に答える
0

カスタマイズされたサブクラスを掘り下げて記述したい場合でも、JDOMを使用することは困難です。XMLOutputterは、トラバースできる完全なツリーが与えられていることを前提としています。メモリを節約するには、現在のサブツリーのみが存在するように何らかの方法で調整する必要があります。横断されたサブツリーを切り落とすことは非常に実行可能です。しかし、サブツリーの作成を必要になるまでどのように延期しますか。これにはすべて、サブクラス化されたXMLOutputter、特殊なElement、およびBeanナビゲーションコードの間で何らかの調整が必要になります。おそらく努力する価値はありません。

G_Hもそうですが、Stax、javax.xml.stream.XMLStreamWriterを独自の「Beanナビゲーター」と組み合わせて確認することをお勧めします。

于 2011-04-05T13:42:58.180 に答える
0

バイアスの宣言-私はEclipseLinkJAXB(MOXy)のリーダーです


EclipseLink JAXB(MOXy)を使用すると、必要なフォーマットを取得できる場合があります。これにより、メモリフットプリントを削減するためにJDOM部分を排除できます。

モデルに次のクラスがあると仮定します(スペースを節約するためにアクセサーは省略されています)。

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    private Address billingAddress;

    private Address shippingAddress;

}

JAXBマッピング

EclipseLink MOXyはJAXB仕様(JSR-222 )に準拠しているため、デフォルトで次のドキュメントが生成されます。

<customer>
    <billingAddress/>
    <shippingAddress/>
</customer>

パスマッピング

XMLをきめ細かく制御する必要がある場合は、MOXyの@XmlPath拡張機能を使用できます。次のようにフィールドに注釈を付けます。

@XmlPath("contact-info/billing-address")
private Address billingAddress;

@XmlPath("contact-info/shipping-address")
private Address shippingAddress;

次のXMLが生成されます。

<customer>
   <contact-info>
      <billing-address/>
      <shipping-address/>
   </contact-info>
</customer>

位置マッピング

XPathフラグメントには、位置インジケーターを含めることができます。

@XmlPath("address[1]")
private Address billingAddress;

@XmlPath("address[2]")
private Address shippingAddress;

結果のXMLは次のようになります。

<customer>
   <address/>
   <address/>
</customer>

条件付きマッピング

@XmlPath("address[@type='billing']")
private Address billingAddress;

@XmlPath("address[@type='shipping']")
private Address shippingAddress;

結果のXMLは次のようになります。

<customer>
   <address type="billing"/>
   <address type="shipping"/>
</customer>

詳細については

于 2011-04-05T14:00:34.503 に答える