немаршальная часть XML как String с использованием xstream - PullRequest
2 голосов
/ 15 ноября 2011

Я использую xstream для маршала / демаршала xml. У меня есть следующий фрагмент XML, для которого я хотел бы сохранить содержимое узла «rawText» в виде строки в bean-компоненте Form.java.

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

1 Ответ

0 голосов
/ 26 января 2015

Насколько я знаю, вы должны создать собственный конвертер и обработать reader.getValue (), чтобы объединить ваш текст, потому что он не возвращает весь текст, как вы хотите.Проверьте следующий код, наиболее заимствованный из этого вопроса .

Конвертер:

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>

До встречи!

...