XStream に自己終了要素を生成させる方法はありますか?
例えば
<foo/>
それ以外の
<foo></foo>
ダウンストリームのXMLプロセッサにとって重要ではないため、これを行う明示的な方法はないようです。
クラスのソースを見てみると、PrettyPrintWriter
おそらくそれが使用されているものです。
少し回避策を使用して問題を解決しました。特に、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;
}
}
そしてそれは働いた!他の誰かに役立つことを願っています。
ドム
コンバーターを使用して、次のように値を設定できます。
このような:
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"/>