2

有没有办法让 XStream 生成自闭合元素?

例如

<foo/>

代替

<foo></foo>
4

3 回答 3

1

似乎没有明确的方法可以做到这一点,因为它对下游 XML 处理器无关紧要。

您可能会查看PrettyPrintWriter该类的源代码,这可能是它正在使用的。

于 2009-11-18T18:10:47.610 回答
1

我使用一点解决方法解决了这个问题。特别是 XStream 只为非原始对象打印自闭合标签;所以我用一个名为“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

您可以使用转换器,然后使用以下方法设置值: 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"/>
于 2016-03-17T00:53:11.723 回答