2011-11-15 20 views
2

我正在使用xstream編組/解組xml。我有以下xml片段,我想將節點'rawText'的內容作爲字符串存儲在Form.java bean上。使用xstream將XML部分解壓爲字符串

<FormData> 

<form id="1"> 

<rawText> 

<h1>All form submitted data goes here</h1>. 
<clob> This can contain more 'xml' like data with more nodes </clob> 

</rawText> 

</form> 

</FormData> 

Form.java

class Form{ 
private int id; 
private String rawText; 

//getters + setters 

} 

所以在上面的例子中,我想獲得以下填充到rawText場表格豆內容。我如何實現這一目標?

<h1>All form submitted data goes here</h1>. 
<clob> This can contain more 'xml' like data with more nodes </clob> 

回答

0

據我所知,你應該建立一個自定義轉換器和處理reader.getValue()來連接你的文字,因爲它只要你想不返回整個文本。 請檢查以下最多從this question借用的代碼。

轉換器:

public class FormConverter implements Converter { 

    @SuppressWarnings("rawtypes") 
    public boolean canConvert(Class clazz) { 
     return Form.class.isAssignableFrom(clazz); 
    } 

    public void marshal(Object value, HierarchicalStreamWriter writer, 
      MarshallingContext context) { 
     throw new UnsupportedOperationException("Do the other way around! ;)"); 
    } 

    public Object unmarshal(HierarchicalStreamReader reader, 
      UnmarshallingContext context) { 
     final Form f = new Form(); 
     f.setId(Integer.parseInt(reader.getAttribute("id"))); 

     reader.moveDown(); 
     if (!"rawText".equals(reader.getNodeName())) { 
      throw new ConversionException("Expected rawText, but was " 
        + reader.getNodeName()); 
     } 
     final StringBuilder text = new StringBuilder(); 
     while (reader.hasMoreChildren()) { 
      reader.moveDown(); 
      buildRecursiveMessage(reader, text); 
      reader.moveUp(); 
     } 
     f.setRawText(text.toString());  
     return f; 
    } 

    private void buildRecursiveMessage(final HierarchicalStreamReader reader, 
      final StringBuilder sb) { 
     // Build start-tag 
     final String nodeName = reader.getNodeName(); 
     sb.append("<" + nodeName); 

     // Build attributes 
     final int numAttributes = reader.getAttributeCount(); 
     if (numAttributes > 0) { 
      sb.append(" "); 
      for (int i = 0; i < numAttributes; i++) { 
       final String attributeName = reader.getAttributeName(i); 
       final String attributeValue = reader.getAttribute(i); 
       sb.append(attributeName + "=\"" + attributeValue + "\""); 

       final boolean lastAttribute = (i == numAttributes - 1); 
       if (!lastAttribute) { 
        sb.append(", "); 
       } 
      } 
     } 

     // Build children 
     final boolean containsChildren = reader.hasMoreChildren(); 
     final boolean containsValue = !reader.getValue().isEmpty(); 
     final boolean empty = !containsChildren && !containsValue; 

     sb.append(!empty ? ">" : " />"); 

     if (containsChildren) { 
      while (reader.hasMoreChildren()) { 
       reader.moveDown(); 
       buildRecursiveMessage(reader, sb); 
       reader.moveUp(); 
      } 
     } else if (containsValue) { 
      sb.append(reader.getValue()); 
     } 

     // Build end-tag 
     if (!empty) { 
      sb.append("</" + nodeName + ">"); 
     } 
    } 
} 

Form類:

@XStreamConverter(value = FormConverter.class) 
public class Form { 
    private int id; 


    private String rawText; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getRawText() { 
     return rawText; 
    } 

    public void setRawText(String rawText) { 
     this.rawText = rawText; 
    } 

} 

只是爲了管理根節點:

public class FormData { 
    private Form form; 

    public Form getForm() { 
     return form; 
    } 

    public void setForm(Form form) { 
     this.form = form; 
    } 
} 

測試:

public static void main(String[] args) { 

     XStream xstream = new XStream(new StaxDriver()); 
     xstream.registerConverter(new FormConverter()); 
     xstream.alias("FormData", FormData.class); 
     FormData f = (FormData) xstream.fromXML(text); 
     System.out.println(f.getForm().getRawText()); 
    } 

輸出:

<h1>All form submitted data goes here</h1><clob> This can contain more 'xml' like data with more nodes </clob> 

再見!

相關問題