有没有办法让XStream生成自闭元素?
E.g。
<foo/>
而不是
<foo></foo>
答案 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"/>