代码之家  ›  专栏  ›  技术社区  ›  waterlooalex

使用XStream自动关闭标签?

  •  2
  • waterlooalex  · 技术社区  · 15 年前

    <foo/>
    

    而不是

    <foo></foo>
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Jim Garrison    15 年前

    似乎没有明确的方法来实现这一点,因为这对下游XML处理器来说并不重要。

    PrettyPrintWriter 类,这可能就是它所使用的。

        2
  •  1
  •   Matthias    13 年前

    我用了一些变通方法解决了这个问题。 特别是XStream仅为非基本对象打印自关闭标记;所以我用一个名为“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格式打印为selfclosing标记(如我所愿)

    我编写了一个自定义转换器,以避免在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;
        }
    }
    

    成功了! 我希望它对其他人有用。

    多姆

        3
  •  0
  •   rdiegoc    9 年前

    您可以使用转换器,然后使用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"/>