2

XStream に自己終了要素を生成させる方法はありますか?

例えば

<foo/>

それ以外の

<foo></foo>
4

3 に答える 3

1

ダウンストリームのXMLプロセッサにとって重要ではないため、これを行う明示的な方法はないようです。

クラスのソースを見てみると、PrettyPrintWriterおそらくそれが使用されているものです。

于 2009-11-18T18:10:47.610 に答える
1

少し回避策を使用して問題を解決しました。特に、XStream は非プリミティブ オブジェクトに対してのみ自己終了タグを出力します。そのため、すべての String オブジェクトを、「値」という 1 つの属性のみを持つ「Element」というジェネリック クラスに置き換えました。

public class Element {
    private String value;
    public Element() {
    }
    public Element(String value) {
        this.value = value;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

このようにして、 Element の null 値は XML で自己終了タグとして出力されます (私が望むように)

空ではないオブジェクトのタグを XML で出力しないようにカスタム コンバーターを作成した後。

public class CustomElementConverter implements Converter
{
    public boolean canConvert(Class type)
    {
        return type.equals(Element.class);
    }
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        String element = ((Element)source).getValue();
        if (element != null) { 
            writer.setValue(element);
        }
    }
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        return null;
    }
}

そしてそれは働いた!他の誰かに役立つことを願っています。

ドム

于 2012-04-17T11:24:01.360 に答える
0

コンバーターを使用して、次のように値を設定できます。

このような:

public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
    Ack ack = (Ack)source;

    writeBasicAck(writer, ack);

    writer.setValue("");
}

protected void writeBasicAck(HierarchicalStreamWriter writer, Ack ack) {
    writer.addAttribute("pos", String.valueOf(ack.getPos()));
    writer.addAttribute("ticket", String.valueOf(ack.getTicket()));
    writer.addAttribute("estado", String.valueOf(ack.getEstado()));
    writer.addAttribute("suc", String.valueOf(ack.getSucursal()));
}

この書き込み:

<ackticket pos="2" ticket="123" estado="0" suc="1235"></ackticket>

それ以外の:

<ackticket pos="2" ticket="123" estado="0" suc="1235"/>
于 2016-03-17T00:53:11.723 に答える