有没有办法让 XStream 生成自闭合元素?
例如
<foo/>
代替
<foo></foo>
似乎没有明确的方法可以做到这一点,因为它对下游 XML 处理器无关紧要。
您可能会查看PrettyPrintWriter
该类的源代码,这可能是它正在使用的。
我使用一点解决方法解决了这个问题。特别是 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;
}
}
它奏效了!我希望它对其他人有用。
多姆
您可以使用转换器,然后使用以下方法设置值: 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"/>