Насколько я знаю, вы должны создать собственный конвертер и обработать 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>
До встречи!