2016-11-24 3 views
2

Java Beanに変換するXML文書があります。これらのフィールド名が変化しないので、Bean内の欠落しているフィールドにhashMapをタグ付けしたいと思います。これを行う方法はありますか?例えばXMLを解析するときにXStreamマップのマップされていないタグをHashMapにマップする方法は?

、私のXMLは、私のJava Beanが、私は私のJava BeanにXMLをロードすると、それは

firstname="stack", lastname="alpha", unknownfields=[{"phone1","999-999-9999"}] 
のようになります

@XstreamAlias("employee") 
public class Employee { 
     private String firstname; 
     private String lastname; 
     private map<String, String> unknownfields; 
} 

ように見える

<employee> 
    <firstname>stack</firstname> 
    <lastname>alpha</lastname> 
    <phone1>999-999-9999</phone1> 
</employee> 

のように見えます

これは良い設計ではありませんが、これがxstreamを使用して実装できるかどうかを確認したいと考えていました。

答えて

0

独自のコンバータを実装します。可能な限り近いものにしたいので、参考実装のためにJavaBeanConverterを見てください。

あなたは違ったものを処理するために必要となる唯一の場所は、(アンマーシャリングメソッド内で)これです

ブロックから、それはあなたが移入すべき MissingFieldExceptionを、スロー、
if (propertyExistsInClass) { 
    Class<?> type = determineType(reader, result, propertyName); 
    Object value = context.convertAnother(result, type); 
    beanProvider.writeProperty(result, propertyName, value); 
    seenProperties.add(new FastField(resultType, propertyName)); 
} else { 
    throw new MissingFieldException(resultType.getName(), propertyName); 
} 

MapここではXML要素名を簡単に使用できますが、値を微調整する必要があります。値を取得するための手がかりは、ちょうど上記かのブロックにあります。

Object value = context.convertAnother(result, type); 

唯一の問題はあなたに値を変換するためのJavaタイプを持っていけないです。多分文字列ですか?

私はJavaBeanConverterを継承し、unmarshalメソッドをオーバーライドしますが、あなたのニーズに合っています。

+0

ありがとうSoumik。あなたのヒントを理解しました。試してみましょう。 – Pals

関連する問題