8

Simple XML フレームワークを使用して、このクラスをシリアル化します。

@Root
public class HowToRenderEmptyTag {
    @Element(required=false)
    private String nullString;
}

私は手に入れたい:

<howToRenderNull>
    <nullString/>
</howToRenderNull>

しかし、私は得る:

<howToRenderNull/>

空の文字列を割り当てようとしました:

@Root
public class HowToRenderEmptyTag {
    @Element(required=false)
    private String emptyString = "";
}

しかし、その後、1 つの開始タグと 1 つの終了タグを取得します。

<howToRenderNull>
    <emptyString></emptyString>
</howToRenderNull>

残念ながら、これは XML を使用するクライアントによって正しく受け入れられず、クライアントの変更は範囲外です。

単一の空のタグを取得する方法についてのアイデアはありますか?

4

2 に答える 2

12

ここでトリックを使用できます。動作を変更する要素のコンバーターを作成します。

HowToRenderEmptyTagクラス:

@Root(name = "howToRenderEmptyTag")
public class HowToRenderEmptyTag
{
    @Element(name = "emptyString", required = false)
    @Convert(value = EmptyElementConverter.class) // Set the converter for this element
    private String nullString;


    // ...
}

EmptyElementConverterクラス:

public class EmptyElementConverter implements Converter<String>
{
    @Override
    public String read(InputNode node) throws Exception
    {
        /* Implement if required */
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void write(OutputNode node, String value) throws Exception
    {
        /* Simple implementation: do nothing here ;-) */
    }
}

文字列に対してこれを実装する必要はありませんConverter。この例ではオプションです。クラスをジェネリックのままにしておくか、それを実装してObject、要素の王様に使用できるようにすることができます。

例:

final File f = new File("test.xml");

HowToRenderEmptyTag example = new HowToRenderEmptyTag("");

Serializer ser = new Persister(new AnnotationStrategy()); // Don't forget AnnotationStrategy here!
ser.write(example, f);

そして最後に結果:

<howToRenderEmptyTag>
   <emptyString/>
</howToRenderEmptyTag>

両方を使用したので、空の要素にemptyStringまたはnullStringという名前が必要かどうかはわかりませんが、それを変更することは大したことではありません:-)

于 2013-06-20T18:20:32.403 に答える