2009-11-18 96 views

回答

1

不來做到這一點明確的方式,因爲它不應該事關對下游的XML處理器。

您可能會看看PrettyPrintWriter類的來源,這可能是它使用的。

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; 
    } 
} 

這樣元素的空值將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; 
    } 
} 

它的工作! 我希望對別人有用。

大教堂

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"/>