使用XStream自行关闭标签?

时间:2009-11-18 17:12:12

标签: xml xstream

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

E.g。

<foo/>

而不是

<foo></foo>

3 个答案:

答案 0 :(得分:1)

似乎没有明确的方法来执行此操作,因为它不应该对下游XML处理器有用。

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

答案 1 :(得分:1)

我使用一点解决方法解决了这个问题。 特别是XStream仅为非原始对象打印自闭合标记;所以我用一个名为“Element”的Generic类替换了所有String对象,只有一个属性“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;
    }
}

这样,Element的空值将以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;
    }
}

它有效! 我希望它对其他人有用。

的Dom

答案 2 :(得分: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"/>