Самозакрывающиеся теги с XStream? - PullRequest
2 голосов
/ 18 ноября 2009

Есть ли способ заставить XStream генерировать самозакрывающиеся элементы?

* 1003 Е.Г. *

<foo/>

вместо

<foo></foo>

Ответы [ 3 ]

1 голос
/ 17 апреля 2012

Я решил проблему с помощью небольшого обходного пути. В частности, XStream печатает самозакрывающиеся теги только для не примитивного объекта; поэтому я заменил все объекты String на общий класс с именем «Element» только с одним атрибутом «value».

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;
    }
}

Таким образом, нулевые значения Элемента будут напечатаны в 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;
    }
}

И это сработало! Я надеюсь, что это будет полезно для кого-то еще.

Дом

1 голос
/ 18 ноября 2009

Кажется, что нет явного способа сделать это, так как он не должен иметь значения для нижестоящих процессоров XML.

Вы можете взглянуть на источник класса PrettyPrintWriter, который, вероятно, и используется.

0 голосов
/ 17 марта 2016

вы можете использовать конвертер, а затем установить значение с помощью: writer.setValue ("");

как это:

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"/>
...