【问题标题】:unmarshal part of XML as String using xstream使用 xstream 将 XML 的一部分解组为字符串
【发布时间】:2011-11-15 18:16:52
【问题描述】:

我正在使用 xstream 来编组/解组 xml。我有以下 xml 片段,我想将节点“rawText”内容存储为 Form.java bean 上的字符串。

<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

}

所以在上面的示例中,我想将以下内容填充到 Form bean 上的 rawText 字段中。我如何做到这一点?

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

【问题讨论】:

    标签: xml marshalling xstream unmarshalling


    【解决方案1】:

    据我所知,您应该构建一个自定义转换器并处理 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 + ">");
            }
        }
    }
    

    表单类:

    @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>
    

    再见!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-07
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      相关资源
      最近更新 更多